2017-05-08 4 views
1

アプリに多くのレポートを追加する必要があるため、私のLaravel構造に問題があります。私の雄弁なモデルは、リストア、追加、挿入、更新を可能にするため、コントローラにすべてを入れるのは良い考えではないと思います。私のクエリには、ジョイン、およびsum()、max()、min()などのいくつかの数学関数を持つ複数のテーブルが必要です。大きなSQLクエリはどこでLaravelに保存できますか?

私がCodeigniterを使用したとき、モデルファイル内の各クエリでメソッドを追加しました。 私はそれを$ sales-> salesReport()と呼ぶことができ、それは私にデータを与えました。

+2

は、より詳細に依存するが、それはサービスのために良い場合のように聞こえます。 –

+0

これらのサービスについてもう少し説明してもらえますか?なぜなら、私はコントローラにたくさんのクエリを入れたくないからです。ありがとう。 – Developer933

答えて

0

質問が本当に行われているかの問題で、何が担当している:

はあなたのモデルに

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

ソースを追加します。ロジックが保持され、何が使用できるかについては、優れたものがあります。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); 
    } 

} 
+0

それは私には良い選択と思われます。サービスファイルをどこに置くか教えていただけますか? – Developer933

+0

あなたが 'App \ Models'を持っているなら、私は' App \ Services'を提案します –

0

Laravelは、あなたが記述したものと一致するCodeigniterに類似したものを提供します。クエリスコープ、より正確にはローカルスコープと呼ばれています。彼らをあなたのモデルに入れておき、いつでも呼び出すことができます。 https://laravel.com/docs/5.4/eloquent#local-scopes

+0

さて、これは良い考えだと思いますが、テーブルが増えれば、レポートなのでより複雑なクエリが必要になります。関連するすべてのテーブルとたくさんの結合をしたくありません。スコープメソッドにカスタムSQLクエリを配置することが可能かどうか教えてください。もしそうなら、私にとっては解決策になるかもしれません。ありがとう。 – Developer933

+0

スコープクエリーに入れるのは、あなた次第です。必要なだけ多くのテーブルに参加できます。しかし、それは最高の設計アプローチですか?それを決めるのはあなた次第です。 Traits、Helpers、Services、Query Scopeなどを使用して同じことを達成できます。それは最終的にあなた次第です。 – EddyTheDove

+0

したがって、これらのメソッドを雄弁なモデルに入れるのは正しいですか? public function scopeSalesReport(){ 戻り値DB :: select( 'select * from ...'); } public function scopeSalesReportByMonth(){ return DB :: select( 'select * from ...'); } そうでない場合は、別の方法がありますか? – Developer933

関連する問題