Из документов:
https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads
$users = App\User::with(['posts' => function ($query) {
$query->where('title', 'like', '%first%');
}])->get();
Редактировать, другой ответ правильный. Вы должны добавить его к вашему актуальному запросу, а не просто заменить егокак я предложил вначале:
Итак, из вашего примера это будет выглядеть так:
$posts = App\Post::with('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
Вы также можете просто добавить отложенную загрузку после запроса
$posts->load(['comments' => function ($query) {
$query->where('content', 'like', 'foo%');
}]);
Edit, решение, предложенное @HelenChe (оригинальный asker), оно в основном то же самое, полезно, если with
и wherehas
будут иметь одинаковую функцию фильтра.
$posts = Post::whereHas('comments', $filter = function ($query) {
$query->where('content', 'like', 'foo%');
})->with(['comments' => $filter])->get();