Laravel get all categories with posts count

AiAbdrahim :

Hi, I'm trying to get Array contain all Categories with Number of Posts in each category: Ex:

[
{id: 1, name: "category1", posts: 15 },
{id: 2, name: "category2", posts: 33 },
{id: 3, name: "category3", posts: 27 }
]

Details:

  • Posts Table
public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('slug')->unique();
        $table->string('title');
        $table->string('image');
        $table->text('description');
        $table->integer('category_id')->unsigned();;
        $table->longText('content');
        $table->boolean('published')->default(0);
        $table->timestamps();
    });
}
  • Categories Table
public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
        $table->timestamps();
    });
}
  • Posts Model
public function category()
{
  return $this->belongsTo('App\Models\Category');
}
  • Category Model
public function posts()
{
  return $this->hasMany('App\Models\Post');
}
  • Categories Controller
public function index()
{
  $Categories  = Category::with('posts')->get();
  return response()->json($Categories);
}

but the this function return posts with all filed, is way to count them and add number as param in array ?

porloscerros Ψ :

You can use withCount

$categories = Category::withCount('posts')->get(); 

then you can loop trough $categories and access to

$category->posts_count 

on each category .

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=9659&siteId=1