За последние 24 часа нас посетили 17995 программистов и 1577 роботов. Сейчас ищут 870 программистов ...

Количество комментарий

Тема в разделе "Laravel", создана пользователем Dimon2x, 4 июн 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Надо вывести количество коментов, для открытой статьи.

    Посмотрел я на код ORM и мне это не нравится и решил сделать с помощью построителя, допустимый ли такой вариант?

    PHP:
    1. $post = Post::where('slug', $slug)->firstOrFail();
    2.      
    3. $commentsCount = DB::table('comments')->where('post_id',$post->id)->count();
    --- Добавлено ---
    Можете показать хорошие практики? В гугле статьи есть, но они старые и неизвестно, актуальный ли этот способ или нет.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Для одной - ничего, а если куча статей, то лучше так: https://laravel.com/docs/master/eloquent-relationships#counting-related-models
    Если уже используешь Eloquent. К чести разработчиков, надо отметить, что в Laravel они попытались уже решить всё, для чего в других фреймворках приходится с ORM на SQL переключаться.
    --- Добавлено ---
    Дело в том, что разработчики Eloquent уже постарались составить все такие запросы оптимальным образом.
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer сделал запрос, как показано в статье

    PHP:
    1. $commentsCount = Post::withCount('comments')->get()
    И для любой статьи, выводит не количество комментарий именно для этой статьи, а количество всего комментарий в таблице

    PHP:
    1. $commentsCount[0]['comments_count']
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну это всё надо смотреть. Ну не может быть таких глюков в Laravel, сообщество давно бы заметило. Так что смотреть надо, что у тебя не так. Покажи таблицы и как ты связь задал
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    А как ты связь ставишь в модели?
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer вообще никак, пишу только $commentsCount= Post::withCount('comments')->get()
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну и откуда фреймворк должен знать, как они у тебя связаны? Читай доку, думай головой :)
    --- Добавлено ---
    https://laravel.com/docs/master/eloquent-relationships#one-to-many
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Пытаюсь вывести количество комментов, для каждой статьи, с помощью строителя, сначала просто вывожу все статьи и комменты к ним

    PHP:
    1. $users = DB::table('users')
    2.             ->join('posts', 'users.id', '=', 'posts.user_id')
    3.             ->join('comments', 'posts.id', '=', 'comments.post_id')
    4.             ->select('users.*', 'posts.title', 'comments.text')
    5.             ->get();
    6.      
    7.         dd($users);
    И теперь хочу подсчитать, количество комментов, для каждой статьи, делаю так, как в инструкции и не работает, пишет, что countComment не существует.

    PHP:
    1.  $users = DB::table('users')
    2.             ->join('posts', 'users.id', '=', 'posts.user_id')
    3.             ->join('comments', 'posts.id', '=', 'comments.post_id')
    4.             ->select(DB::raw('count(comments.post_id) as countComment, comments.post_id'))
    5.             ->where('comments.post_id', '=', 'posts.id')
    6.             ->select('users.*', 'posts.title', 'countComment')
    7.             ->get();
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Так выводит пустоту

    PHP:
    1.  $users = DB::table('comments')
    2.                     ->join('posts', 'posts.id', '=', 'comments.post_id')
    3.                      ->select(DB::raw('count(*) as countComment, post_id'))
    4.                      ->where('post_id', '=', 'comments.post_id')
    5.                      ->groupBy('post_id')
    6.                      ->get();
    7.        
    8.         dd($users);
    --- Добавлено ---
    @mkramer ORM к строителю относиться не должно
     
  12. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    Может я что-то не понял, не проще сделать связи и просто вывести count?
    Типа count($post->comments);
    Или непосредственно уже поулучить count с помощью Eloquent
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Кому не должно? @mkramer показывает тебе laravel-way, именно так и надо делать.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, у тебя в коде используется Eloquent, а чтоб посчитать комменты ты пытаешься какую-то дичь писать сам... Если бы хоть запросы были приличные, а то всё в кучу, и group by, и join (который вообще непонятно зачем там прилетел) и ещё кучу всего.
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @romach ну да

    Код (Text):
    1. 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.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, но Eloquent дополняет query builder новыми фишками крутыми. Но даже если ты по какой-то причине не хочешь использовать Eloquent, запрос у тебя кривой. Попробуй сначала тоже самое написать на SQL без всяких Builder-ов, тогда поймёшь, почему не работает то, что с Builder-ом. Если на чистом SQL слабо, значит рано перешёл на Laravel, надо основу подтянуть. Любой успешный программист на Laravel может написать свой код и без всякого Laravel. Если @romach или @artoodetoo или кому угодно из успешных самых людей сказать: в этом проекте я хочу, чтобы был чистый PHP без фреймворков и библиотек, они напишут. Да, будет немного дольше, да, будет намного намного дороже, но напишут. Пока не можешь написать проект сам, во фреймворки лезть нет смысла.
     
  17. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer мне на чистом SQL проще делать, особенно джоинить, это код я легко делаю, это как игра в домино

    Код (Text):
    1. $sql2 = "SELECT
    2.             questions.id,
    3.             questions.question_name,
    4.             questions.answer,
    5.             questions.variant1,
    6.             questions.variant2,
    7.             questions.variant3,
    8.             questions.variant4,
    9.             questions.user_id,
    10.             questions.city_id,
    11.             questions.street_id,
    12.             questions.date,
    13.             questions.img,
    14.             users.login,
    15.             city.city_name,
    16.             street.street_name,
    17.             COUNT(comments.questions_id) as countComment
    18.             FROM questions
    19.             INNER JOIN users ON questions.user_id = '".$user_id."' AND questions.user_id = users.id
    20.             INNER JOIN city ON questions.city_id = city.id
    21.             INNER JOIN street ON questions.street_id = street.id
    22.             LEFT JOIN comments ON comments.questions_id = questions.id
    23.             GROUP BY questions.id ORDER BY questions.id DESC LIMIT " . $start .', ' . $num;
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Вот только нельзя так группировать.
    --- Добавлено ---
    В реальных системах заводят поле со счётчиком.
    Если тебе в чисто учебных целях хочется поиграть с группирующими запросами, то знай правила: при группировке во фразе select не могут стоять произвольные поля. Там допустимы только те данные, которые напрямую зависят от группирующего выражения.
    Проще говоря там могут быть только поля из фразы group by и агрегатные функции от других полей, например count().
    --- Добавлено ---
    Раз в пару месяцев я пишу об этом на форуме )))
    --- Добавлено ---
    В зависимости от настроек, майсиквел может простить тебе неправильный запрос и выдать фиг пойми какие данные, либо может выдать ошибку.