在Laravel中,我在哪里可以存储我的大型SQL查询?

在Laravel中,我在哪里可以存储我的大型SQL查询?,laravel,eloquent,models,Laravel,Eloquent,Models,我的Laravel结构有一个问题,因为我需要向我的应用程序中添加许多报告,所以我认为将所有内容都放在控制器中不是一个好主意,因为我雄辩的模型允许我列出、添加、插入和更新,我的查询需要多个带有联接的表,以及一些数学函数,如sum()、max()、min() 当我使用Codeigniter时,我为模型文件中的每个查询添加了方法。 所以我可以称之为$sales->salessreport(),它给了我数据。Laravel提供了类似于Codeigniter的东西,与您描述的内容相匹配。它被称为查询范围,

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

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

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

你加入你的模型

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

资料来源:

问题其实是在做什么,什么应该负责。关于逻辑应该保存在哪里以及可以使用什么,有一些很好的建议。我有点不清楚,你是在问把像示波器之类的东西链接起来,还是仅仅把你的逻辑放在哪里。我可能需要一个服务:

<?php

class SalesReportService {

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

        return $result;
    }

}

取决于更多的细节,但这听起来是服务的一个很好的例子。你能再给我解释一下这些服务吗?因为我不想在控制器上放太多的查询。谢谢。我认为这是个好主意,但是如果你有更多的表,你需要更复杂的查询,因为这是一个报表,我不想对所有相关的表进行太多的连接。您能告诉我是否可以将自定义SQL查询放在scope方法中吗?如果是这样的话,它可以为我工作,这可能是一个解决办法。谢谢。范围查询中的内容完全由您决定。您可以连接任意多个表。然而,这是最好的设计方法吗?由你来决定。您可以使用Traits、Helpers、服务、查询范围等来完成相同的任务。这最终取决于你。那么,把这些方法放在一个雄辩的模型中是正确的吗?公共函数scopeSalesReport(){return DB::select('select*from…');}公共函数scopeSalesReportByMonth(){return DB::select('select*from…');}如果没有,还有其他选择吗?在使用查询范围时,建议只放置与特定模型相关的写函数。但如果你只想保留对你有用的查询,你可以使用traits。在控制器中,您只需将该特性与
use-App\Traits\Sales一起使用
和该特性中的每一个函数都将可供控制器使用。拉威尔本身就很善于利用特质。在我看来,这是个不错的选择。你能告诉我服务文件放在哪里吗?好的,如果你有
App\Models
我建议
App\Services
<?php

class SalesController extends Controller {

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

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

}