Укажите, какие модели отношений возвращаются в зависимости от того, где - PullRequest
0 голосов
/ 21 октября 2018

Пример из документации:

$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

Это будет искать посты, у которых есть хотя бы один комментарий с foo.Он вернет модель поста с всеми комментариями.Есть ли способ ограничить это возвращением пост-модели и связанных комментариев, которые имеют только foo?

Я знаю, что мы можем просмотреть $posts с условным условием позже, но я ищурешение через построитель запросов, если это возможно.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Если вам нужны только сообщения, в которых есть хотя бы один комментарий с foo с этими комментариями.Вы должны объединить эти две функции, whereHas() и with()

$posts = App\Post::whereHas('comments', function ($query) {
        $query->where('content', 'like', 'foo%');
    })->get();
    ->with('comments', function ($query) {
        $query->where('content', 'like', 'foo%');
    })->get();
0 голосов
/ 21 октября 2018

Из документов:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...