Надо вывести количество коментов, для открытой статьи. Посмотрел я на код ORM и мне это не нравится и решил сделать с помощью построителя, допустимый ли такой вариант? PHP: $post = Post::where('slug', $slug)->firstOrFail(); $commentsCount = DB::table('comments')->where('post_id',$post->id)->count(); --- Добавлено --- Можете показать хорошие практики? В гугле статьи есть, но они старые и неизвестно, актуальный ли этот способ или нет.
Для одной - ничего, а если куча статей, то лучше так: https://laravel.com/docs/master/eloquent-relationships#counting-related-models Если уже используешь Eloquent. К чести разработчиков, надо отметить, что в Laravel они попытались уже решить всё, для чего в других фреймворках приходится с ORM на SQL переключаться. --- Добавлено --- Дело в том, что разработчики Eloquent уже постарались составить все такие запросы оптимальным образом.
@mkramer сделал запрос, как показано в статье PHP: $commentsCount = Post::withCount('comments')->get() И для любой статьи, выводит не количество комментарий именно для этой статьи, а количество всего комментарий в таблице PHP: $commentsCount[0]['comments_count']
Ну это всё надо смотреть. Ну не может быть таких глюков в Laravel, сообщество давно бы заметило. Так что смотреть надо, что у тебя не так. Покажи таблицы и как ты связь задал
Ну и откуда фреймворк должен знать, как они у тебя связаны? Читай доку, думай головой --- Добавлено --- https://laravel.com/docs/master/eloquent-relationships#one-to-many
Пытаюсь вывести количество комментов, для каждой статьи, с помощью строителя, сначала просто вывожу все статьи и комменты к ним PHP: $users = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->join('comments', 'posts.id', '=', 'comments.post_id') ->select('users.*', 'posts.title', 'comments.text') ->get(); dd($users); И теперь хочу подсчитать, количество комментов, для каждой статьи, делаю так, как в инструкции и не работает, пишет, что countComment не существует. PHP: $users = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->join('comments', 'posts.id', '=', 'comments.post_id') ->select(DB::raw('count(comments.post_id) as countComment, comments.post_id')) ->where('comments.post_id', '=', 'posts.id') ->select('users.*', 'posts.title', 'countComment') ->get();
Где такое в инструкции? Это какой-то бессмысленные и беспощадные запросы, которые непонятно чего делают --- Добавлено --- https://laravel.com/docs/master/eloquent-relationships#counting-related-models Сначала, естественно, все связи надо объявить.
Так выводит пустоту PHP: $users = DB::table('comments') ->join('posts', 'posts.id', '=', 'comments.post_id') ->select(DB::raw('count(*) as countComment, post_id')) ->where('post_id', '=', 'comments.post_id') ->groupBy('post_id') ->get(); dd($users); --- Добавлено --- @mkramer ORM к строителю относиться не должно
Может я что-то не понял, не проще сделать связи и просто вывести count? Типа count($post->comments); Или непосредственно уже поулучить count с помощью Eloquent
@Dimon2x, у тебя в коде используется Eloquent, а чтоб посчитать комменты ты пытаешься какую-то дичь писать сам... Если бы хоть запросы были приличные, а то всё в кучу, и group by, и join (который вообще непонятно зачем там прилетел) и ещё кучу всего.
@romach ну да Код (Text): Since Eloquent models are query builders, you should review all of the methods available on the query builder. You may use any of these methods in your Eloquent queries.
@Dimon2x, но Eloquent дополняет query builder новыми фишками крутыми. Но даже если ты по какой-то причине не хочешь использовать Eloquent, запрос у тебя кривой. Попробуй сначала тоже самое написать на SQL без всяких Builder-ов, тогда поймёшь, почему не работает то, что с Builder-ом. Если на чистом SQL слабо, значит рано перешёл на Laravel, надо основу подтянуть. Любой успешный программист на Laravel может написать свой код и без всякого Laravel. Если @romach или @artoodetoo или кому угодно из успешных самых людей сказать: в этом проекте я хочу, чтобы был чистый PHP без фреймворков и библиотек, они напишут. Да, будет немного дольше, да, будет намного намного дороже, но напишут. Пока не можешь написать проект сам, во фреймворки лезть нет смысла.
@mkramer мне на чистом SQL проще делать, особенно джоинить, это код я легко делаю, это как игра в домино Код (Text): $sql2 = "SELECT questions.id, questions.question_name, questions.answer, questions.variant1, questions.variant2, questions.variant3, questions.variant4, questions.user_id, questions.city_id, questions.street_id, questions.date, questions.img, users.login, city.city_name, street.street_name, COUNT(comments.questions_id) as countComment FROM questions INNER JOIN users ON questions.user_id = '".$user_id."' AND questions.user_id = users.id INNER JOIN city ON questions.city_id = city.id INNER JOIN street ON questions.street_id = street.id LEFT JOIN comments ON comments.questions_id = questions.id GROUP BY questions.id ORDER BY questions.id DESC LIMIT " . $start .', ' . $num;
Вот только нельзя так группировать. --- Добавлено --- В реальных системах заводят поле со счётчиком. Если тебе в чисто учебных целях хочется поиграть с группирующими запросами, то знай правила: при группировке во фразе select не могут стоять произвольные поля. Там допустимы только те данные, которые напрямую зависят от группирующего выражения. Проще говоря там могут быть только поля из фразы group by и агрегатные функции от других полей, например count(). --- Добавлено --- Раз в пару месяцев я пишу об этом на форуме ))) --- Добавлено --- В зависимости от настроек, майсиквел может простить тебе неправильный запрос и выдать фиг пойми какие данные, либо может выдать ошибку.