Dream811
Dream811

Reputation: 61

how to use hasOne for two other detail models in laravel

I have one main table and two detail tables table names: tb_main, tb_detail1, tb_detail2

tb_main
id, detail_code
tb_detail1
id, main_id
tb_detail2
id, main_id

I want get detail data using one function in main model

public function detail()
    {
        if(detail_code == 1)
            return $this->hasOne(Detail1::class, 'main_id', 'id');
        else
            return $this->hasOne(Detail2::class, 'main_id', 'id');
    }

Any ideas? please help me! And sorry for my bad English.

Upvotes: 1

Views: 265

Answers (2)

John Lobo
John Lobo

Reputation: 15319

You can use $this->detail_code

public function detail() { 

if($this->detail_code == 1) {

   return $this->hasOne(Detail1::class, 'main_id', 'id'); 

}else{

   return $this->hasOne(Detail2::class, 'main_id', 'id');

} 

Upvotes: 2

Salar Bahador
Salar Bahador

Reputation: 1494

Don't do that in the relation method. First, declare all relations in the main model like so:

public function detail1()
{
   return $this->hasOne(Detail1::class, 'main_id');
}

public function detail2()
{
   return $this->hasOne(Detail2::class, 'main_id');
}

Then write one method to decide what to do based on detail_code :

public function detail()
{
    if($this->detail_code == 1)
        return $this->detail1()->first();

    return $this->detail2()->first();
}

Upvotes: 1

Related Questions