您好我想使用 whereIn 從表中獲取資料:
$values = DB::table('attribute_product')->whereIn('value_id' , [1,5])->get();
但我想獲得包含所有 [1,5] 項的列,而不僅僅是陣列項之一
我的表格資料:
{
"attribute_id": 1,
"product_id": 1,
"value_id": 1
},
{
"attribute_id": 12,
"product_id": 1,
"value_id": 2
},
{
"attribute_id": 13,
"product_id": 1,
"value_id": 3
},
{
"attribute_id": 14,
"product_id": 1,
"value_id": 4
},
{
"attribute_id": 1,
"product_id": 8,
"value_id": 1
},
{
"attribute_id": 12,
"product_id": 8,
"value_id": 5
},
{
"attribute_id": 13,
"product_id": 8,
"value_id": 10
},
{
"attribute_id": 14,
"product_id": 8,
"value_id": 11
}
我只想回傳同時具有 value_ids [1,5] 的:
"attribute_id": 1,
"product_id": 8,
"value_id": 1
},
{
"attribute_id": 12,
"product_id": 8,
"value_id": 5
},
但我上面寫的代碼回傳:
{
"attribute_id": 1,
"product_id": 1,
"value_id": 1
},
"attribute_id": 1,
"product_id": 8,
"value_id": 1
},
{
"attribute_id": 12,
"product_id": 8,
"value_id": 5
},
uj5u.com熱心網友回復:
你可以使用Laravel groupBy
$values = DB::table('attribute_product')->orderBy('product_id', 'desc')->whereIn('value_id', [1, 5])->groupBy('value_id')->get();
uj5u.com熱心網友回復:
這應該有效:
$values = [1, 5];
$filtered = DB::table('attribute_product')
->whereIn('value_id', $values)
->get()
->groupBy('product_id')
->filter(function ($product) use ($values) {
return $product->pluck('value_id')
->intersect($values)
->count() === count($values)
})
->flatten();
PS:我不太喜歡這個解決方案,因為它在記憶體中進行計算。您應該利用關系在資料庫級別執行此操作。
uj5u.com熱心網友回復:
我重新創建了您共享的資料庫示例:
INSERT INTO
attribute_product(attribute_id, product_id, value_id)
VALUES
(1, 1, 1), (12, 1, 2), (13, 1, 3), (14, 1, 4), (1, 8, 1), (12, 8, 5), (13, 8, 10), (14, 8, 11);
出來這個raw query:
SELECT
attribute_product.*,
SUM(value_id) as filter
FROM
`attribute_product`
WHERE
value_id IN(1, 5)
GROUP BY
product_id
HAVING
filter = 6;
然后使用Illuminate\Database\Query\Builder
$filter = [1, 5];
DB::table('attribute_product')
->groupBy('product_id')
->select([
'attribute_product.*',
DB::raw("SUM(value_id) as filter"),
])
->whereIn('value_id', $filter)
->having('filter', '=', array_sum($filter))
->get();
該解決方案完全由資料庫引擎管理,從而避免了您的服務器的操作負載Collections。
觀點
我覺得這是實作您的目標的一種棘手方法,這對我來說意味著您的資料庫設計不太適合業務邏輯/用例。
我認為一個好的資料庫設計有助于通過簡單的查詢(當然使用連接)或直觀的方式進行復雜的資料檢索Eloquent Relationships
舊答案
$filter_value_id = [1, 5];
$values_by_product = DB::table('attribute_product')
->whereIn('value_id', $filter_value_id)
->get()
->groupBy('product_id');
foreach ($values_by_product as $product => $value) {
echo "product id: $product<br>";
if ($value->count() === sizeof($filter_value_id))
dump($value);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430335.html
上一篇:Laravel關系存盤到樞軸空
下一篇:Laravel中的哈希
