2017-11-11 152 views
1

我想複製使用Eloquent ORM時獲得的結果集,除了使用Laravel Query Builder。基本上使用這段代碼,我可以讓包出現在產品中,這樣當我將它們循環到視圖中時,我可以進一步循環每個產品中的包。似乎很基本的權利(見下面的結果集)。使用Laravel 5.3查詢生成器複製子查詢的Eloquent ORM數據結構

 $get_posts_for_product = Product::where('active', 1) 
       ->with('packs') 
       ->get()->toArray(); 

enter image description here

我一直在使用Query Builder來得到這個工作,嘗試了一些辦法,但我認爲這將內嵌加入包。

什麼是使用查詢生成器得到這個相同的數組結構的最佳方式,我知道結果集是一個不同類型的數組,這是很好,但對我的項目來說,它必須在這一點上使用查詢生成器完成。

謝謝。

回答

1

我會說,這就是爲什麼你有雄辯:你不必擔心如何讓這些關係在一起。

但是櫃面你真的想達到同樣的結果,我會用兩個表usersmessages演示這一點:

第1種方法:

檢索用戶和通過查詢關係數據庫改造它:

$result = DB::table('users')->get()->transform(function ($user){ 
     $user->messages = DB::table('messages')->where('user_id', $user->id)->get(); 
     return $user; 
}); 

下行:擁有許多用戶意味着消息表上有很多數據庫查詢。

上行:以下代碼寫

第二方法:

$users = DB::table('users')->get(); 
$messages = DB::table('messages')->whereIn('user_id', $users->pluck('id')->toArray())->get(); 

$result = $users->transform(function ($user) use ($messages){ 
     $user->messages = $messages->where('user_id', $user->id)->values(); 
     return $user; 
}); 

使用的用戶所有的ID來查詢消息檢索這兩個表下行:ne編輯仍然轉換它。

上行:較少的數據庫行程。即只有兩個查詢。

$user = DB::table('users')->get(); 
$messages = DB::table('messages')->whereIn('user_id', $user->pluck('id')->toArray()) 
      ->get() 
      ->groupBy('user_id'); 

$result = $user->transform(function ($user) use ($messages){ 
    $user->messages = $messages[$user->id]; 
    return $user; 
}); 

缺點:

3方法

轉化users結果時看起來像第二個不同之處在於,你可以通過 'user_ID的' 組消息,那麼你做任何額外的過濾器:與2相同。

上行:轉換用戶時無需額外過濾器。

其他方法

查詢然後變換的響應時加入對用戶和消息,或者簡單地使用它,因爲它是。

PS:Eloquent使用查詢生成器。

答案是可以更新的。

+1

雄辯隱藏這兩個步驟給你...優秀的答案... – Serge

+1

優秀的答案。謝謝你的幫助。 – Thinkpad