У меня есть модели laravel: Сообщение и комментарий. Как нормальный, пост будет иметь много комментариев таблицы, как показано ниже:Laravel eloquent - как использовать DB raw внутри пользовательских отношений
Posts table
--------------------------------------
|id |title | |
--------------------------------------
|1 |test |
comments table:
--------------------------------------
|id |post_id | created_at |
--------------------------------------
|1 |1 |2015-09-12 09:01:02 |
--------------------------------------
|2 |1 |2015-09-12 09:03:02 |
теперь я хочу, чтобы запросить пост с наибольшим количеством комментариев от текущей даты обратно в последние 7 дней. Вот мой код в Laravel контроллера:
$posts= Post::whereHas(
'comments', function ($q) {
$q->select(DB::raw("DATE_FORMAT(created_at,'%Y-%m-%d %H:%i:%s')"),'post_id',DB::raw('count(*) as cmt_count'))
->where(DB::raw('`comments`.`created_at` BETWEEN NOW()-INTERVAL 8 DAY AND NOW()'))
->groupBy('post_id');
})
->take(5)->get();
получил ошибку:
QueryException in Connection.php line 651: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 3 column(s) (SQL: select * from `posts` where (select DATE_FORMAT(created_at,'%Y-%m-%d %H:%i:%s'), `post_id`, count(*) as cmt_count from `comments` where `comments`.`post_id` = `posts`.`id` and `comments`.`created_at` BETWEEN NOW()-INTERVAL 8 DAY AND NOW() is null group by `post_id`) >= 1 limit 5)
Пожалуйста, помогите, чтобы указать мне, что я делаю неправильно?
благодарю за ваш ответ, но ваш запрос не работает, как ожидайте. Bellow - это ответ на ошибку от laravel: 'QueryException в строке Connection.php 651: SQLSTATE [21000]: нарушение кардинальности: 1241 Операнд должен содержать 3 столбца (SQL: выберите * из сообщений, где (выберите DATE_FORMAT (created_at, '% Y -% m-% d% H:% i:% s '), post_id, count (*) как cmt_count из комментариев, где comments.post_id = post.id и comments.created_at МЕЖДУ СЕЙЧАС() - ИНТЕРВАЛ 8 ДЕНЬ И СЕЙЧАС () group by post_id)> = 1 limit 5) ' – user804293