Pranav Mandlik
Pranav Mandlik

Reputation: 644

Retrieve post by category id laravel

I want to retrieve all post with given category, i am developing api, at input i will receive category name, and then i want to retrieve that category by its id in posts table,i want to do this because if some changed category name in the future i dont have to change that in my code i have create like this

PostController.php

  public function getPostsByCategory(Request $request)
{

    $posts=Posts::where('category',$request->category)->get();
    return response()->json(['posts'=>$posts]); 
}

Post model

<?php

 namespace App;

 use Illuminate\Database\Eloquent\Model;

class Posts extends Model
{   

protected $fillable = [
    'post_title','post_description', 'category', 'user_id',
];

Category Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Posts_Category extends Model
{

}

can you please help me with this, please suggest me any idea

Upvotes: 3

Views: 4573

Answers (5)

Raphael Emediong
Raphael Emediong

Reputation: 11

Please i need a fix solution to this, i want to fetch all the latest post from a specific category in my laravel blog project

These are my models

Category model

    public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }


Post model

 public function categories()
    {
        return $this->belongsToMany('App\Category')->withTimestamps();
    }

What's they next thing to do?
please help

Upvotes: 1

Hardik Savani
Hardik Savani

Reputation: 69

$posts = Posts::where('category_id', $category->id)->get();

Upvotes: -1

ZeroOne
ZeroOne

Reputation: 9117

i think you are looking for with eager load function

You must store category id not the name of the category..

class Posts extends Model
{   
     protected $fillable = [
        'post_title','post_description', 'category_id', 'user_id',
     ];

     public function category()
     {
          return $this->belongsTo(Posts_Category::class, 'category_id', 'id');
     }
}

use as

$posts = Posts::where('category_id',$request->category)->with('category')->get();

If you really want to search by name

$posts = Posts::whereHas('category', function ($q) {
   $q->where('category_name', 'like', "%{$request->category}%");
})->get();

Upvotes: 3

Hamid Vetr
Hamid Vetr

Reputation: 111

you're doing this the wrong way from the get go. best practice is to store category_id in posts table, of course this is only if you need a one-to-many relation between posts and categories table. plus I wouldn't recommend to break the convention of naming models unless you have no other way. I suggest you to read this section more thorough

https://laravel.com/docs/5.6/eloquent-relationships

Upvotes: 1

Javi Stolz
Javi Stolz

Reputation: 4753

You can fetch the category by its name first, and then filter posts by category id

public function getPostsByCategory(Request $request)
{
    $category = Posts_Category::whereName($request->category)->firstOrFail();
    $posts=Posts::where('category',$category->id)->get();
    return response()->json(['posts'=>$posts]); 
}

Upvotes: 1

Related Questions