Laravel Eloquent ORM从SQL聚合函数

时间:2014-04-22 18:41:10

标签: php sql sqlite orm laravel

我正在与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();
}

由于保持应用程序的其余部分更清洁,我可以定义其他方法以获得具有不同逻辑的出价。

2 个答案:

答案 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;
}