【问题标题】:Where can I store my big SQL queries in Laravel?在 Laravel 中我可以在哪里存储大型 SQL 查询?
【发布时间】:2017-10-07 00:25:14
【问题描述】:

我的 Laravel 结构有问题,因为我需要向我的应用程序添加许多报告,所以我认为将所有内容都放在控制器中并不是一个好主意,因为我的 eloquent 模型允许我列出、添加、插入和更新,而我的查询需要多个带有连接的表,以及一些数学函数,如 sum()、max()、min()。

当我使用 Codeigniter 时,我在模型文件中为每个查询添加了方法。 所以我可以称之为 $sales->salesReport() 它给了我数据。

【问题讨论】:

  • 取决于更多细节,但这听起来像是服务的好案例。
  • 您能否向我解释一下有关这些服务的更多信息,因为我不想在控制器上提出很多查询。谢谢。

标签: laravel eloquent models


【解决方案1】:

问题实际上是关于正在做什么以及由什么负责的问题。有一些优秀的posts 说明应该在哪里保留逻辑以及可以使用什么。我有点不清楚您是否在询问链接范围之类的东西,或者更多只是将您的逻辑放在哪里。我可能会有服务:

<?php

class SalesReportService {

    public function generateReport(Sales $sales)
    {
        // logic here...

        return $result;
    }

}

然后在控制器中会是这样的:

<?php

class SalesController extends Controller {

    public function __construct(SalesReportService $reportService)
    {
        $this->reportService = $reportService;
    }

    public function show(Sales $sales)
    {
        return $this->reportService->generateReport($sales);
    }

}

【讨论】:

  • 在我看来这是一个不错的选择。你能告诉我我把服务文件放在哪里吗?
  • 好吧,如果你有App\Models,我建议App\Services
【解决方案2】:

Laravel 提供了类似于 Codeigniter 的东西,与您所描述的相匹配。它被称为查询范围,或更准确地说是本地范围。您可以将它们保留在您的模型中,并随时调用它们。

你添加你的模型

public function scopeSalesReport($query) {
    return $query->join(...);
}

来源:https://laravel.com/docs/5.4/eloquent#local-scopes

【讨论】:

  • 嗯,我认为这是个好主意,但是如果您有更多表,则需要更复杂的查询,因为它是一个报告,而且我不想对所有相关表进行大量连接。您能告诉我是否可以将自定义 SQL 查询放入范围方法中?如果是这样,它可以为我工作,它可能是一个解决方案。谢谢。
  • 您在范围查询中输入的内容完全取决于您。您可以根据需要加入任意数量的表。然而,这是最好的设计方法吗?由您决定。你可以使用 Traits、Helper、Services、Query Scope 等来完成同样的事情。这最终取决于你。
  • 那么,将这些方法放在一个雄辩的模型中是否正确? public function scopeSalesReport(){ return DB::select('select * from...'); } public function scopeSalesReportByMonth(){ return DB::select('select * from...');如果没有,还有其他选择吗?
  • 使用查询范围时,建议只放置与特定模型有关的写入函数。但是,如果您只想保留对您有一些“作用”的查询,您可以使用特征。在您的控制器中,您可以简单地将该特征与 use App\Traits\Sales; 一起使用,并且该特征中的每个函数都将可供您的控制器使用。 Laravel 本身大量使用了特征。
猜你喜欢
  • 2011-10-24
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2020-09-08
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多