Laravel: эффективный способ подсчета связанных моделей с помощью предложения where

#php #mysql #eloquent #laravel-5.2 #relationship

#php #mysql #красноречивый #laravel-5.2 #взаимосвязь

Вопрос:

У меня есть две модели User и Posts

  • Пользователь: идентификатор, имя
  • Сообщение: идентификатор, заголовок, сообщение, идентификатор пользователя

Я хочу проверить, имеет ли some user posts значение с given title .

 $user = User::find($userId);
$posts = $user->posts;
$postsWithGivenTitle = $posts->where('title','=',$title);
$postCount = $postsWithGivenTitle->count();
  

Я полагаю, что это должно сработать, но мне нужно пойти выше этого и сделать это эффективно. Итак, я получил это, и это работает, но все еще не уверен, правильно ли это сделать.

 $user = User::find($userId)->withCount(['posts' => function ($q) use ($title) {
    $q->where('title','=',$title);
}])->first();
  

а затем проверить количество:

 if ($user->posts_count > 0) { 
    //do something
}
  

Что меня смущает и выглядит некрасиво, так это использование методов find() и first() в том же запросе. Так что, надеюсь, я здесь упускаю что-то простое и переосмысливаю это.

Спасибо

Ответ №1:

Как вы можете видеть в документах: https://laravel.com/docs/5.3/eloquent-relationships

Вы можете получить то, что хотите, следующим образом:

 $user = User::withCount(['posts' => function($q){....}])->find($id)