Как связать две переменные Eloquent Builder вместе? - PullRequest
0 голосов
/ 07 ноября 2019

Допустим, у меня есть переменная $myQuery, то есть Illuminate\Database\Eloquent\Builder, построенная из цепочки Локальные и / или динамические области действия . Для него может быть задано что-то вроде Comment::lengthBetween(1000, 50000)->popular(), что позволит найти длинные популярные комментарии при его выполнении.

Как получить сообщения, комментарии которых соответствуют $myQuery? Это выглядит как работа для whereHas:

$posts = Post::whereHas('comments', function (Builder $query) use ($myQuery) {
    // Insert code here
})->get();

Вставка $query->lengthBetween(1000, 50000)->popular(); дает правильные результаты для этой конкретной комбинации областей, но $myQuery - это переменная , которая выиграла 'эти области всегда используются.

Функция union здесь не работает по нескольким (надеюсь, очевидным) причинам. Также не устанавливается $query = $myQuery (потому что whereHas переводится в SQL where exists, и ему необходимо связать внешний и первичный ключи, что делается в $query).

Так как я могу связать $query и $myQuery?


Примечание:

  • Этот код является лишь примером, основанным на Документах Laravel ;мой реальный код похож, но не о постах и ​​комментариях.
  • Я не хочу использовать DB::raw(), потому что это ужасно.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Вы можете вызвать область действия другой модели.

Попробуйте что-то вроде этого.

$posts = Post::whereHas('comments', function ($query) use ($myQuery) {
    $query->lengthBetween(1000, 50000)->popular();
})->get();

С объединением

$posts = Post::->join(
    DB::raw('(' . $myQuery->toSql() . ') comments'),
    'comments.post_id'
    '=',
    'post.id'
)->mergeBindings($myQuery->getQuery())->get();
0 голосов
/ 07 ноября 2019

Возможно, не то, что вы ожидали, но вы всегда можете получить идентификаторы и затем отфильтровать ваш второй запрос по ним:

$ids = $myQuery->select('id')->get();

$posts = Post::whereHas('comments', function (Builder $query) use ($ids) {
    $query->whereIn('id', $ids);
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...