#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'));
}