2016-12-30 4 views
4

Например, я могу проверить каждый пост с конкретной датой.Laravel Eloquent: как получить связанные записи через метод whereHas()?

$users = User::whereHas('posts', function($q){ 
    $q->where('created_at', '>=', '2015-01-01 00:00:00'); 
})->get(); 

Но предположим, что делать, если я хочу, чтобы сравнить дату после модели (created_at) с атрибутом даты модели пользователя?

Например:

$users = User::whereHas('posts', function($q){ 
    $q->where('created_at', '>=', ** $user->customDate ** ← look this); 
})->get(); 

обн. Я использую Красноречие за пределами Ларавеля.

+0

Является ли customDate поле в таблице пользователей? –

+0

Да, MySQL DATE полевой тип – Stanislav

+0

В чем смысл? чего вы пытаетесь достичь? – Sherif

ответ

2

Вы можете использовать необработанное выражение в ответном запросе «Яркий», используя $q->whereRaw.

В вашем примере:

$users = User::whereHas('posts', function($q){ 
    $q->whereRaw("created_at >= users.customDate"); 
})->get(); 

В отличие от DB::raw, это может быть использовано без инъекции зависимостей Laravel о Illuminate\Database фасада.

1

Предполагая, что ваша таблица пользователей просто называется users вы можете использовать DB::raw() для ссылки на значение, как если бы в обычном запросе:

$users = User::whereHas('posts', function($q){ 
    $q->where('created_at', '>=', DB::raw('users.customDate')); 
})->get(); 

Не забудьте либо импортировать DB фасад или просто изменить его до \DB::raw(...).

Если вы используете это вне Laravel и не имеете фасадов вы можете вырезать посредник и сделать:

$q->where('created_at', '>=', new Illuminate\Database\Query\Expression(('users.customDate')); 

Надеется, что это помогает!

+0

Хм, ваш метод будет работать в этой ситуации? ScheduledEvent :: find (1) -> orders-> где ('dateFrom', '=', ORDER_CUSTOM_DATE); – Stanislav

+0

@Stanislav Что?!? –

+0

Это аналогичная задача, где необходимо получить записи из соответствующей таблицы заказов через конкретный order.customDate в том месте. – Stanislav

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