我正在使用 Laravel 4 进行一个项目。
我有两个表,“拍卖”和“出价”,我想获取所有出价最低的拍卖。 (我想获得所有的“出价”模型)
我可以在 SQlite 中编写每次拍卖的查询,如下所示:
select *,min(bids.amount) from auctions,bids where auctions.id = bids.auction_id and auctions.id = 2 ;
我已经设置了关系拍卖 hasMany('Bids') 和 bids ownTo('Auction') 以便我可以调用
$auctions = Auction::with('bids')->get();
获取所有带有嵌套出价模型的拍卖,以便我可以调用
$auctions->bids
我认为访问出价。
由于我不想获取 100 个出价并计算我的 View 中的最低出价,因此将最低出价逻辑移至模型中的最佳方法是什么?
更新
两种解决方案都是有效的,实际上最有效的是将其放入模型中
public function getLowestBidAttribute() {
return $this->bids()->orderBy('amount','asc')->first();
}
由于保持应用程序的其余部分更干净,我可以定义其他方法来获取具有不同逻辑的出价。
最佳答案
您可以使用访问器来实现此目的:
// Auction model
public function getLowestBidAttribute()
{
return $this->bids()
->remember(1) // cache the query for a minute
->orderBy('amount', 'asc')->first();
}
// you can also check isset() lowestBid on $this->attributes, but this is a bit cleaner
// and most of the time caching query for a minute will be enough to avoid multiple queries
然后您可以轻松访问它:
$auction->lowestBid; // Bid model you need
<小时/>
编辑:上面的代码对于单个拍卖来说是可以的,但是当你获取拍卖集合时,它将导致n+1问题,我建议在代码中处理它,但这不是问题:
// Auction model
public function bids()
{
return $this->hasMany('Bid')->orderBy('amount','asc');
}
然后在集合上使用first()方法:
// $auctions = Auction::with('bids')->get();
foreach($auctions as $auction)
{
$auction->bids->first(); // Bid model with lowest amount value
}
关于php - 来自 SQL 的 Laravel Eloquent ORM 聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227668/