php - 在 Laravel 查詢生成器中,php Laravel: 如何使用派生表/子查詢

  显示原文与译文双语对照的内容
82 1

編輯:

儘管這個問題最初是針對我描述的查詢,但應用於 Laravel 中的派生表/子查詢幾乎所有問題。

問題:

最近我在 Laravel 查詢生成器中有點停留。 它有一些非常好的特性,但我覺得它不是為更複雜的資料庫操作而構建的。

這是我試圖生成的查詢:


select 



'IFNULL(counted.product_count, 0) AS product_count', 


'uncounted.value', 


'uncounted.attribute_id', 


'uncounted.attribute_option_id' 



 from ( 



 select


 'counted.id', 


 'counted.attribute_id', 


 'counted.value', 


 'count(counted.attribute_id) AS product_count'



 from `attribute_options` as `counted` 


 where `counted.product_id` in (?,?,?,?,?) 


 group by `counted.attribute_option_id` 



 ) as 'counted' 



right join 'attribute_options' as 'uncounted'


 on 'counted.id' = 'uncounted.id' 



 group by 'attribute_option_id'



查詢的解釋: 我正在 Laravel 中為我的產品目錄構建一個刻面搜索。 產品根據過濾器/屬性的用戶提供範圍縮小。 為了更好的用戶體驗,我想顯示每個過濾器留下的產品數量,這就是上面的查詢所做的: 計算product_id在產品 array 中的某個屬性的所有產品。id

我的嘗試:


 $productIds = [ 1, 2, 3, 4, 5 ];



 $subQuery = DB::table('attribute_options')->selectRaw('counted.id, counted.attribute_id, counted.value, count(counted.attribute_id) AS product_count')


 ->from('attribute_options AS counted')


 ->whereIn('counted.product_id', $productIds)


 ->groupBy('counted.attribute_option_id')


 ->mergeBindings($subQuery);



 $query = Model::selectRaw('IFNULL(counted.product_count, 0) AS product_count, uncounted.value, uncounted.attribute_id, uncounted.attribute_option_id')


 ->from(DB::raw(' ( '. $subQuery->toSql(). ' ) AS counted '))


 ->rightJoin('attribute_options AS uncounted', 'counted.id', '=', 'uncounted.id')


 ->groupBy('attribute_option_id')


 ->get();



請幫助我,因為我不喜歡使用 DB::raw() 或者 DB::select() 語句。 那不會是"laravelish"或者"eloquent"。

时间: 原作者:

149 1

你第一次嘗試看起來很接近。 嘗試這個:

最後,我刪除了長名稱空間引用並建議你添加一個 use 語句以使代碼更容易讀。


$productIds = [ 1, 2, 3, 4, 5 ];



$subQuery = DB::table('attribute_options AS counted')->selectRaw('counted.id, counted.attribute_id, counted.value, count(counted.attribute_id) AS product_count')


 ->whereIn('counted.product_id', $productIds)


 ->groupBy('counted.attribute_option_id')



$query = AttributeOption::selectRaw('IFNULL(counted.product_count, 0) AS product_count, uncounted.value, uncounted.attribute_id, uncounted.attribute_option_id')


 ->from(DB::raw(' ( '. $subQuery->toSql(). ' ) AS counted '))


 ->mergeBindings($subQuery->getQuery())


 ->rightJoin('attribute_options AS uncounted', 'counted.id', '=', 'uncounted.id')


 ->groupBy('attribute_option_id')


 ->get();



...