簡體   English   中英

Laravel雄辯的一個模型和許多模型之間的關系如MorphOne?

[英]Laravel Eloquent relationship between one Model and Many Models as MorphOne?

介紹:

我有這些表與他們的模型:

  • 地址表 - >地址模型
  • 用戶表 - >用戶模型
  • 公司表 - >公司型號
  • 屬性表 - >屬性模型

規則:

  • 每個用戶只能擁有一個地址。
  • 每個公司只能有一個地址。
  • 每個屬性只能有一個地址。

可以在此處完成兩種可能的關系規划:

  • 用戶有一個地址和地址屬於用戶[即一對一的關系],但缺點是這里的外鍵位於地址表即user_id字段,並通過與其他模型[公司和財產]重復相同的關系,我們將獲得地址表中的另外兩個外鍵是[ company_idproperty_id ],那么我們最終會得到 3個模型的3個外鍵但每行記錄只會填充一個,只留下兩個外鍵字段留空

    我覺得這是地址表的間接費用。

或者相反:

  • 地址hasOne用戶和用戶所屬地址[一對一關系也]。 這樣做的好處是它可以將外鍵保存在相關模型中,即[用戶,公司和屬性],這樣就沒有外鍵的空字段---但這仍然違背了現實生活中的建模邏輯,它決定了用戶 hasOne地址超過地址 hasOne用戶。

我的問題:

是否有任何其他關系可以將這4個模型綁定在一個類似於多態關系的關系中,但是沒有使用MorphMany但是使用MorphOne這很奇怪,我在Laravel的文檔中找不到它,盡管該方法本身存在於Eloquent Relations中。

這種MorphOne多態關系是否可能以及它是如何組成的?

現有代碼:

//Address model
public function user(){
    return $this->hasOne(User::class);
}
public function company(){
    return $this->hasOne(Company::class);
}
public function property(){
    return $this->hasOne(Property::class);
}

//User model
public function address(){
    return $this->belongsTo(Address::class);
}

//Company model
public function address(){
    return $this->belongsTo(Address::class);
}
//Property model
public function address(){
    return $this->belongsTo(Address::class);
}

以下是一方地址與另一方用戶公司財產之間的MorphOne關系:

class Address extends Model
    public function addressable(){
        return $this->morphTo();
    }       
}

class User extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable'); //note this is not MorphMany()
    }       
}

class Company extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable');
    }       
}

class Property extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable');
    }       
}

那么在UserController中就是這樣的:

$user = User::find(1);

$addressData = [
    'street_name' => '5, Golf street',
    'country_id' => 100, //etc..
];

//to add new address record related to user:
$user->address()->create($addressData);
dd($user->address);

//to update existing address record related to user:
$user->address->update($addressData);
//dd($user->address);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM