我有2张桌子,物品和投标。
项目hasMany(出价);
表项目
表格出价
现在我想显示每个项目的最高出价。
这是我的代码
$data = PostItem::with([
'bids' => function($query) {
$query->orderBy('new_bid','desc')->get();
}
])
->get();
但问题是它需要所有出价。
但如果我使用此代码
$data = PostItem::with([
'bids' => function($query) {
$query->orderBy('new_bid','desc')->take(1);
}
])
->get();
最新出价只需1次,不要对每件商品进行最新出价。
如何正确地做到这一点?
提前致谢
答案 0 :(得分:1)
将limit()
添加到关系:
public function highestBids()
{
return $this->hasMany('App\Bid')->orderBy('new_bid', 'desc')->limit(1);
}
然后获得最高出价:
$data = PostItem::with('highestBids')->get();
答案 1 :(得分:0)
您可以将查询编写为:
$items = PostItem::with(['bids' => function($query){
$query->orderBy('new_bid','desc');
}])
->get();
现在要获得每件商品的最高出价:
foreach ($items as $item) {
$highest_bid = $item->bids->first(); // highest bids of $item
if($highest_bid) {
$new_bid = $item->new_bid;
}
}
答案 2 :(得分:0)
您可以使用distinct()
方法获取唯一记录。请尝试以下查询。
$items = PostItem::with(['bids' => function($query){
$query->distinct()
->select('item_id')
->orderBy('new_bid','desc')
->groupBy('item_id')
->get();
}])
->get();
答案 3 :(得分:0)
我有答案,但可能不是最佳答案。
所以我仍然使用我的第一个查询,然后在视图中我正在使用@foreach。 因为我已经先排序了最高出价,所以我添加@break来打破foreach所以它不会循环所有结果。
但我相信有更好的方法可以做到这一点