Использование модельных отношений в одном запросе - PullRequest
0 голосов
/ 30 января 2019

Рассмотрим следующее:

$posts = $this->model->newQuery()
    ->whereIn('user_id', $user->following) // specifically this line
    ->orWhere('user_id', $user->id)
    ->get();

Проблема с вышесказанным заключается в том, что существует два запроса:

  • Получить следующее: $user->following
  • Получитьposts: Above

Это было бы намного эффективнее с использованием подзапроса, однако я не могу вспомнить правильный способ сделать это ...

Я попробовал всеиз следующего:

// This was a long-shot...
...->whereIn('user_id', function ($query) use ($user) {
    $query->raw($user->following()->toSql());
});

// This works but pretty sure it can be done better with eloquent...
...->whereIn('user_id', function ($query) use ($user) {
    $query->select('follow_id')
        ->from('user_follows')
        ->where('user_id', $user->id);
});

Есть ли способ, которым это может быть достигнуто путем использования ранее определенного отношения $user->following() вместо ручного определения запроса отношения, как в предыдущем примере выше?

Ссылка

Отношение following определяется следующим образом:

/**
 * Get the users that the user follows.
 */
public function following()
{
    return $this->belongsToMany('SomeApp\User\Models\User', 'user_follows', 'user_id', 'follow_id')
        ->withTimestamps();
}

1 Ответ

0 голосов
/ 30 января 2019

Используйте это:

->whereIn('user_id', $user->following()->getQuery()->select('id'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...