получить сообщения, в которых количество отношений равно атрибуту сообщения

#laravel #eloquent

Вопрос:

У меня есть модель «Пост», в базе данных которой есть поле «ежедневно».

 $table->integer('daily'); // could be anything
 

Модель «Сообщение» имеет отношение к модели «Комментарии».

 public function comments() {
    return $this->hasMany(Comment::class);
}

public function completed() {
    return $this->hasMany(Comment::class)->completed();
}
 

Модель комментариев

 public function scopeCompleted($query) {
       return $query->....?
}
 

Я хочу, чтобы все сообщения пользователя, в которых количество комментариев равно полю «ежедневно» поста. Например: если ежедневное поле сообщения равно » 5 » и к этому сообщению есть 5 комментариев, я хочу видеть это сообщение в возвращенных списках, в противном случае не возвращайте его.
Я знаю, что могу получить их все и сделать это с помощью цикла, но я хочу знать, есть ли какой-либо способ сделать это только с помощью красноречия.

Ответ №1:

Попробуйте это

    $user=User::with('posts','posts.comments')
          ->whereHas('posts.comments',function ($query){
                  //if any additional filters
           },'=',DB::raw('posts.daily'))
    ->get();
 

или, если не требуется дополнительный запрос, то

 $user=User::with('posts','posts.comments')
          ->whereHas('posts.comments',null,'=',DB::raw('posts.daily'))
          ->get();
 

Комментарии:

1. «DB::raw(‘сообщения. ежедневно»)» возвращает «сообщения. ежедневно», строка, она не получает значение из базы данных для каждой записи

2. да, у меня есть, он возвращает его как «сообщения». ежедневно». Я могу предоставить sql некоторые данные позже.

3. @CritingZ вы протестировали мое решение? если проверено, то не могли бы вы указать, какие ошибки или неправильный результат он показывает, чтобы я мог проверить еще раз. если вы предоставите sql некоторые данные, я смогу проверить их со своей стороны

4. @CritingZ возвращает его как » сообщения. ежедневно» означает ? я не понял, что вы имеете в виду под этим

5. @CritingZ можете ли вы показать sql, сгенерированный вашим кодом, для моего ответа

Ответ №2:

Получилось так, что все работает вот так

 public function scopeCompleted($query) {
     return $query->has('comments', '=', DB::raw('posts.comments'));
}