#php #mysql #laravel #laravel-8
#php #mysql #laravel #laravel-8
Вопрос:
извините, я хочу спросить. Заранее прошу прощения, если мой язык не является аккуратным
У меня есть таблица категорий с colom -id (pk) -name -и другие
и у меня есть таблица post с colom -id (pk) -category_id (fk)
- и другие
Я хочу подсчитать количество сообщений из каждой категории вместе с названием категории в laravel 8. это мой jquery, но все равно неправильно
$categ = DB::table('posts')
->select('category_id', 'categories.id', DB::raw('count(posts.id) as total_product'))
->join('categories', 'posts.category_id', '=', 'categories.id')
->groupBy('posts.category_id')
->get();
кто-нибудь хочет мне помочь?
Ответ №1:
Если вы готовы использовать Eloquent, ответ будет намного проще.
Post будет моделью для таблицы posts
Категория будет моделью для таблицы категорий
между моделями будут взаимно однозначные или любые другие отношения в соответствии с требованиями
Допустим, между категорией и моделью Post существует отношение «один ко многим». Этого можно достичь, добавив функцию в вашу модель категории
public function posts()
{
return $this->hasMany(Post::class);
}
тогда вы можете использовать что-то вроде…
Category::withCount('posts')->get()
Комментарии:
1. большое вам спасибо, сэр, это сработало, но у меня есть еще один вопрос, поэтому вопрос, который я задал выше, действительно не может быть выполнен, сэр? потому что мне удалось выполнить этот запрос на рабочей среде sql
2. Это можно сделать, даже ваш код тоже выглядит нормально, возможно, какая-то проблема с опечаткой. И конструктор запросов почти на 0,5% быстрее, чем eloquent. Но eloquent поставляется с некоторым набором концепций безопасности, таких как защита от массового присвоения, внедрение БД и различные атрибуты, такие как скрытые или кастинг. На самом деле Laravel не принесет вам реальной пользы, если вы не используете eloquent.
Ответ №2:
Я предполагаю, что вы используете неправильные имена таблиц в запросе или, возможно, указали неправильное имя таблицы в вопросе.
Допустим, ваше имя таблицы post — posts, а таблица categories — categories, тогда ваш запрос должен быть:
$categ = DB::table('posts')
->select('categories.id', "categories.name", DB::raw("count(posts.id) as total_product"))
->join('categories, "posts.category_id', '=', 'categories.id')
->groupBy('posts.category_id')
->get();
Пожалуйста, обратите внимание — Не забудьте заменить имена таблиц на ваши таблицы.
Если вы используете это для одноразовой загрузки, вы также можете использовать отношения модели для получения полной информации без создания пользовательского запроса.
https://laravel.com/docs/8.x/eloquent-relationships
У вас может быть отношение категории к публикации. Допустим, у вас есть модели Category и Post, тогда вы можете иметь отношение ниже в модели категории.
public function posts(){
return $this->hasMany(Post::class, 'category_id', 'id');
}
И затем в вашем коде вы можете использовать $category->posts
для получения коллекции сообщений для категории и можете использовать $category->posts->count()
для получения количества сообщений для категории.