【问题标题】:filter by first foreign key按第一个外键过滤
【发布时间】:2015-02-07 04:34:05
【问题描述】:

我正在创建一个网站来比较不同商店的产品价格。我已经用这两个表建立了一个数据库。

+---------+     +------------+
| Product |     | Price      |
+---------+     +------------+
| id      |     | id         |
| name    |     | product_id |
+---------+     | price      |
                | date       |
                +------------+

现在我希望能够获取最后一个price.date 早于某个日期的所有产品。

我曾尝试使用以下代码,但没有成功。

Product::with(['prices' => function($q){
    $q->first()->where('date', '<', Carbon::yesterday());
}])->get()->prices();

有人可以帮我解决这个问题吗?

提前致谢:)

【问题讨论】:

  • 不确定first() 在那里做什么,如果它需要在那里,为什么它在查询的开头?它将返回结果或 null,因此您不能将 -&gt;where() 链接到它。

标签: laravel laravel-4 foreign-keys eloquent


【解决方案1】:

With() 仅用于预加载记录。

你需要使用whereHas:

Product::whereHas('price',function($q) { return $q->where('date', '<', Carbon::yesterday()); })->whereHas('price',function($q) { return $q->where('date','>=',Carbon::yesterday()); },'=',0)->get();

这将返回所有where has 价格的产品dateless 而不是Carbon::yesterday()

Official Documentation

【讨论】:

  • 这不会尝试所有记录吗?我想要所有昨天之后还没有价格的产品。
  • 不,不会的。这并不急于加载price 表。相反,它执行where (select count(*) from price where date &lt; 'yesterday' and product_id = product.id) &gt; 0
  • 查看 eloquent 正在运行哪些查询。在查询末尾添加toSql()(而不是get()),然后转储它。
  • 是的,但是当这个产品有一个月前的价格和今天的价格时,它仍然会被选中,因为它会找到比昨天更早的日期。我想查找所有在昨天之前没有价格的产品。每种产品都有多种价格。
  • 我明白你的意思。改变了我的答案。它将显示昨天之前有价格和昨天之后没有价格的所有产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2014-09-15
  • 2012-12-15
  • 1970-01-01
  • 2012-07-15
  • 2021-06-25
相关资源
最近更新 更多