我正在与Laravel 4合作开展一个项目。
我有两个表,'拍卖'和'出价',我想以他们拥有的最低出价获取所有拍卖。 (我想获得所有'出价'模式)
我可以在SQlite中为每次拍卖编写查询,如:
select *,min(bids.amount) from auctions,bids where auctions.id = bids.auction_id and auctions.id = 2 ;
我已设置关系拍卖hasMany('出价')并出价belongsTo('Auction')以便我可以致电
$auctions = Auction::with('bids')->get();
以嵌套的Bids模型进行所有拍卖,以便我可以调用
$auctions->bids
我认为可以访问出价。
由于我不想获取100个出价并计算我的观看次数中的最低出价,将最低出价逻辑移到模型中的最佳方法是什么?
更新
两种解决方案都是有效的,实际上最有效的方法是将其放入模型中
public function getLowestBidAttribute() {
return $this->bids()->orderBy('amount','asc')->first();
}
由于保持应用程序的其余部分更清洁,我可以定义其他方法以获得具有不同逻辑的出价。
答案 0 :(得分:2)
您可以使用访问者:
// 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
}
答案 1 :(得分:1)
您可以迭代拍卖并获取每个拍卖的最低出价,如下所示:
foreach($auctions AS $auction) {
echo $auction->bids->min('bid');
}
在拍卖模式中,与deczo的答案相结合更好,您要求的是:
function getMinBidAttribute() {
return $this->bids()->min('bid');
}
然后你可以这样称呼它:
foreach($auctions AS $auction) {
echo $auction->minBid;
}