Mohamed  Kira
Mohamed Kira

Reputation: 417

laravel call to undefined method addEagerConstraints()

I have two models

Post.php

id

post

show_id

type = 'movie' or 'tv'

Show.php

id // this only auto increment counter ids
show_id

show_type = 'movie' or 'tv'

the thing is show can be either tv or movie and may two with the same show_id for exmaple one tv could have a show_id of 10 and also one movie can have it but the types are diffrent

i have in post model

public function show(){
      return $this->belongsTo('App\Show', 'show_id');
    }

in show model

public function post(){
  return $this->hasMany('App\Post', 'id');
}

this relationship get the first show with matching show id it sees, wheather its a movie or tv, i want to restrict it to match type column on both sides

Upvotes: 2

Views: 12154

Answers (3)

Rafael
Rafael

Reputation: 7746

post.php:

public function show() {
    return $this->belongsTo('App\Show', 'show_id', 'show_id')
                ->where('type', $this->type);
}

show.php

public function posts() {
    return $this->hasMany('App\Post', 'show_id', 'show_id')
                ->where('type', $this->show_type);
}

UPDATE (the code above does not work!)

Trying to use where clauses (like in the example below) won't work when eager loading the relationship because at the time the relationship is processed $this->f2 is null.

Read more here: Compoships

Upvotes: 2

Mohamed  Kira
Mohamed Kira

Reputation: 417

I just came accross a package https://github.com/topclaudy/compoships what it does it allows creating relationships based on more than one FK, which laravel doesnt support by default

Upvotes: 1

whmkr
whmkr

Reputation: 3085

I think what you're looking for is a polymorphic relation. Instead of having a model that may be one of two "types" there should probably be two separate models on the same relation. For example:

class Post 
{
    public function Show() 
    {
        return $this->morphTo();
    }
 }

class TvShow
{
    public function Post() 
    {
        return $this->morphMany('App\Post', 'show');
    }
 }
class Movie
{
    public function Post() 
    {
        return $this->morphMany('App\Post', 'show');
    }
 }    

Then your posts table would have a show_id and show_type field that would relate to either a tv show or movie. Check out the docs for more info, I'm not sure of the rest of your project so I'm not 100% this will fit but anytime you start putting "_type" fields in your table you should question whether or not you should be using a polymorphic relation. This will also likely keep your models cleaner and free of a bunch of if statements as you realize there are other differences between movies and shows and how you handle them.

https://laravel.com/docs/5.7/eloquent-relationships#polymorphic-relations

Upvotes: 0

Related Questions