Home > Mobile >  Get all the genres that a movie belongs to in the Laravel REST API
Get all the genres that a movie belongs to in the Laravel REST API

Time:07-05

Asside from the $movie data I want to also get all the genres that a movie belongs to following this path: 127.0.0.1:8000/api/movies/{id}. My foreign keys are in the separate table so how exactly I can achieve that? My migrations:

    public function up()
    {
        Schema::create('genres', function (Blueprint $table) {
            $table->id();
            $table->string('name');
        });
    }

public function up()
    {
        Schema::create('movies', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('status')->nullable()->default(0);
            $table->string('image_path')->default('default.png');
        });
    }
    public function up()
    {
        Schema::create('genre_movie', function (Blueprint $table) {
            $table->foreignId('genre_id')->constrained()->cascadeOnDelete();
            $table->foreignId('movie_id')->constrained()->cascadeOnDelete();
        });
    }

Movie model:

class Movie extends Model
{
    use HasFactory;

    public $timestamps = false;
    protected $fillable = ['name', 'status', 'image_path'];

    public function genres()
    {
        return $this->belongsToMany(Genre::class, 'genre_movie');
    }
}

Genre model:

class Genre extends Model
{
    use HasFactory;

    public $timestamps = false;
    protected $fillable = ['name'];

    public function movies()
    {
        return $this->belongsToMany(Movie::class, 'genre_movie');
    }
}

Movie Resource:

 public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'status' => $this->status,
            'image_path' => url()->to('/images/' .$this->image_path),
        ];
    }

Genre Resource:

public function toArray($request){
        return [
            'id' => $this->id,
            'name' => $this->name,
        ];
    }

Function in the controller which only returns $movie data:

public function show(Movie $movie)
    {
        return new MovieResource($movie);
    }
  

I thought this would work:

public function show(Movie $movie)
    {
        return new MovieResource($movie->with('genres'));
    }

But I receive this error: "message": "Property [id] does not exist on the Eloquent builder instance."

CodePudding user response:

You can return JSON with a small change too.

public function showMovieAndGenre(Movie $movie)
    {
       $fullData = Movie::join('genres', 'genres.id', '=', 'movies.id')
       ->select([
       'movies.id AS mid',
       'genres.id AS gid',
       'movies.name AS mname',
       'genres.name AS gname',
       'movies.status AS status',
       'movies.image_path AS image_path'
       ])
       ->get();
        return $fullData;
    }

CodePudding user response:

return $this->belongsToMany(Genre::class, 'genre_movie');

Consider using hasManyThrough https://laravel.com/docs/9.x/eloquent-relationships#has-many-through

  • Related