2016-12-13 5 views
1
//Eloquent relationship 
$customer = App\Customer::find($id); //1s query 
return $orders = $customer->orders(); //2nd query 

class 
public function orders() { 
    return $this->hasMany('App\Order', 'customer_id')->get(); 
} 

//Query builder, only query once 
$data = DB::table('customers') 
     ->select('orders.name...') 
     ->leftJoin('orders', 'customers.id', '=', 'orders.customer_id') 
     ->get(); 

私は現在laravelを学んでいますが、私は左の結合クエリを行うために関係を使用するときに疑問を抱いていました。laravelリレーションシップクエリは2回ですか?

これはパフォーマンスに優れていますか?クエリビルダーの左結合は、私が通常使うものである1つのクエリを保存することができます。

+3

あなたの 'orders'関係のメソッドでは' return $ this-> hasMany( 'App \ Order'、 'customer_id');を返すだけで ' - > get() – Parziphal

答えて

1

クエリビルダはパフォーマンスに優れています。それはeloquentモデルの初期設定を簡素化

2つのクエリを使用して -

https://blog.sriraman.in/laravel-eloquent-vs-fluent-query-builder/

+1

@Benjamin W nooneは、実際のプロジェクトでリクエストごとに1000件のクエリを実行するので、自分自身に質問してください。2 msクエリの代わりに1msクエリを取得するためにEloquentのすべての機能とプロを緩和する準備はできていますか? –

+0

@AlexeyMezeninどのオペレーションの方がパフォーマンスが良いかを尋ねました。彼は答えが – scottevans93

+0

はい、技術的に速いです。しかし、私はちょうどいくつかのクエリを比較しました。そして、全体の要求実行の違いは、クエリビルダの場合は583.2 ms、Eloquentの場合は583.5 msです。だから私はあなたが実際のアプリを扱っているときにそのようなベンチマークを見たくないと言いたい。 ORM、可読性、および保守性のパワーを1 msの実行時間で販売しています。それが私の主張です。 –

2

私はので、説得力の関係が非常に優れていると言うでしょう。

代わりに結合クエリを使用すると、2つの列が同じ名前を持つ可能性があります(例:id)。したがって、明示的に列を選択することになります。

PHP側では、正しいeloquentクラスに委任できるように値を適切にアンパックします。これにより、実行時間がさらに長くなり、コードの複雑さはもちろんのこと、メモリ使用量が増加します。

1

クエリビルダ(または生のSQL)を使用して一度に多くのレコードを取得できますが、明らかに欠点は、クエリビルダが配列を返すためモデルクラスを使用できないことです。すでに知っているように、モデルは単にクエリを手助けするものではありません。それらはそれ以上に有用です。

iCodeによると(これを入力している間に返信した)、「なぜLaravelは列を1つだけクエリーしてすべてのモデルを作成しないのですか?さて、これを行うために必要なクエリ自体とPHPのロジックはかなり複雑で、価値がありません。

最後に、多くのクエリを保存するEloquentリレーションシップでは、OrderレコードのCustomer個のレコードを照会すると、すべてのオーダーが1回のクエリで取得されます。

関連する問題