我想得到最后三个价格(6,7,8)。 我不需要限制。
id: 8
是来自id: 5
的更新,
id: 8
应该显示而不是id: 5
[
{
id: 5,
product_id: 1,
seller_id: 26,
color_id: 18,
warranty_id: 29,
price: 1000000,
created_at: "2017-05-27 09:33:44",
},
{
id: 6,
product_id: 1,
seller_id: 26,
color_id: 19,
warranty_id: 30,
price: 1200000,
created_at: "2017-05-27 09:33:56",
},
{
id: 7,
product_id: 1,
seller_id: 26,
color_id: 21,
warranty_id: 33,
price: 900000,
created_at: "2017-05-27 09:34:06",
},
{
id: 8,
product_id: 1,
seller_id: 26,
color_id: 18,
warranty_id: 29,
price: 600000,
created_at: "2017-05-27 10:21:23",
}
]
我的尝试:
$product->get_prices()
->groupby(['product_id','color_id','warranty_id','seller_id'])
->latest()
->get();
// 5,6,7,8
Product.php
function get_prices(){
return $this->hasMany('\App\Price');
}
答案 0 :(得分:2)
您可以在此处使用unique()
collection method。作为唯一值,我使用给定ID(卖家,产品,保修和颜色ID)与分隔符的组合(如果需要,可以更改。
之前我使用过reverse()
函数,因此唯一函数将返回最后一个重复而不是第一个重复。
然后像往常一样去take()
:)
$product->get_prices()->get()->reverse()->unique(function ($item) {
return $item['product_id'] . "|" . $item['seller_id'] . "|" .
$item['color_id'] . "|" . $item['warranty_id'];
})->take(3);
您也可以在使用给定解决方案之前发出Eloquent Queries:
$product->get_prices()->with("...")->where("....")
->get()->reverse()->unique(function ($item) {
return $item['product_id'] . "|" . $item['seller_id'] . "|" .
$item['color_id'] . "|" . $item['warranty_id'];
})->take(3);
我已经尝试了很多工作的ORM版本,但不幸的是我无法创建一个。 如果你真的想在数据库层上这样做,我猜想更好地使用原始查询。