php - 来自 SQL 的 Laravel Eloquent ORM 聚合函数

标签 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('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/

相关文章:

ios - 应用因数据存储而被拒绝

database - 连接sqlite数据库中两个表的技术

php - 我如何在cakephp中使用插件主题来显示错误消息?

php - 从 SQL if 语句向 MySql 插入 NULL

php - 浏览数据库行

sql - Oracle SQL 开发人员 : If Exists Update Else Insert Missing Right Parenthesis Compiler Error

mysql - 用于搜索 value1 或 value 2 或两者的 SQL 查询,如果两者都不返回全部

sqlite - 没有主键的关系数据库?

用于加载速度的 PHP 和 Javascript/Ajax 缓存 - JSON 和 SimpleXML

sql - 在 SQL Server 2014 中写入基础表后立即查询 View