2014-12-09 8 views
2

Я создаю сайт для сравнения цен на товары в разных магазинах. Я создал базу данных с этими двумя таблицами.фильтр по первому иностранному ключу

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

Теперь я хотел бы быть в состоянии получить все продукты, где последний price.date раньше, чем к определенной дате.

Я попытался использовать следующий код, но безуспешно.

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

Может ли кто-нибудь помочь мне с этой проблемой?

Заранее спасибо :)

+0

Не уверен, что это 'первый() 'делает там, и если это должно быть там, почему это к началу запроса? Он вернет результат или null, поэтому вы не можете направить на него '-> where()'. – alexrussell

ответ

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 цены которых date является less чем Carbon::yesterday()

Official Documentation

+0

Не попробуете ли вы все записи? Я хотел бы иметь все продукты, которые еще не имели цены после вчерашнего дня. – Jerodev

+0

Нет, не будет. Это не требует загрузки таблицы «цена». Вместо этого он делает 'where (выберите count (*) из цены, где date <'вчера' и product_id = product.id)> 0' – Mysteryos

+0

Чтобы узнать, какие запросы выполняются красноречивым. Добавьте 'toSql()' в конце запроса (вместо 'get()') и выгрузите его. – Mysteryos

Смежные вопросы