Laravel / Eloquent - Query on more than one table

1

I have the following Tabelas/Models and I am not able to make a query:

Model 1

id | Name
---+---------------
1  | Model1.1
2  | Model1.2
3  | Model1.3

Model 2

id | Name     | model1_id
---+----------+---------- 
1  | Model2.1 | 1
2  | Model2.2 | 2
3  | Model2.3 | 3

Model 3

id | Name     | model2_id
---+----------+---------- 
1  | Model3.1 | 1
2  | Model3.2 | 2
3  | Model3.3 | 3
class Model1 extends Model
{
   public $table = 'model1';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name','model2_id'];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model2()
   {
      return $this->belongsTo(\App\Models\Model2::class);
   }
}
class Model2 extends Model
{
   public $table = 'model2';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name'];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model1()
   {
      return $this->hasMany(\App\Models\Model1::class);
   }

   public function model2()
   {
       return $this->belongsTo(\App\Models\Model2::class);
   }
}
class Model3 extends Model
{
   public $table = 'model3';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name',];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model2()
   {
      return $this->hasMany(\App\Models\Model2::class);
   }
}

With the example below I could not because what I need is to know Model1 related to Model3 .

$model1 = Model3::where('model2_id', 2);
    
asked by anonymous 07.10.2017 / 21:33

1 answer

1

Relationship N: M Laravel

The models are set wrong in the fillable item you have missed the fields correctly and their relationships are all wrong, see documentation for more information and the links below with examples of how to set up 1: 1 , 1: N and N : M :

Modified example :

class Model1 extends Model
{
   public $table = 'model1';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name'];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model2()
   {
      return $this->hasMany(\App\Models\Model2::class,'model1_id', 'id');
   }
}
class Model2 extends Model
{
   public $table = 'model2';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name','model1_id'];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model1()
   {
      return $this->belongsTo(\App\Models\Model1::class,'model1_id', 'id');
   }

   public function model3()
   {
       return $this->hasMany(\App\Models\Model3::class,'model2_id', 'id');
   }
}
class Model3 extends Model
{
   public $table = 'model3';

   const CREATED_AT = 'created_at';
   const UPDATED_AT = 'updated_at';
   protected $dates = ['deleted_at'];
   public $fillable = ['name','model2_id'];
   protected $casts = ['name' => 'string'];
   public static $rules = [];

   public function model2()
   {
      return $this->belongsTo(\App\Models\Model2::class,'model2_id','id');
   }
}

The question I was left with a bit of doubt, but, I think it's a simple join between the tables:

  

With the example below I could not, because what I need is to know the Model1 related to Model3 .

$model1 = Model1::join('model2','model2.model1_id','=','model1.id')
                ->join('model3','model3.model2_id','=','model2.id')
                ->where('model3.model2_id', 2)
                ->get();

08.10.2017 / 06:08