Laravel Eloquent 一个模型和多个模型之间的关系如吗啡?
Laravel Eloquent relationship between one Model and Many Models as MorphOne?
简介:
我有这些表格及其模型:
- 地址table --> 地址模型
- 用户table --> 用户模型
- 公司table --> 公司型号
- 属性table --> 属性模型
规则:
- 每个用户只能有一个地址。
- 每个公司只能有一个地址。
- 每个属性只能有一个地址。
这里可以进行两种可能的关系规划:
用户hasOne地址和地址belongsTo用户[即一对一关系] 但缺点是这里的外键位于地址 table 即 user_id 字段并通过与其他重复相同的关系模型 [Company and 属性] 我们将在地址 table 中获得另外两个外键,它们是 [company_id 和 property_id],那么我们最终会得到 3 个模型的 3 个外键但是 每一行只会填充一个 记录总是留下两个外键字段留空
我觉得这是对地址 table 的间接费用。
或反过来:
- 地址hasOne用户和用户belongsTo 地址[一对一的关系也]。这样做的好处是它在相关模型中保留外键,即 [User, Company and 属性] 这样就没有外键的空字段 --- 但这仍然违反现实生活中的建模逻辑这表明 User hasOne Address 多于 Address hasOne用户。
我的问题:
是否有任何其他关系可以将这 4 个模型绑定在一个类似于多态关系的关系中,但不使用 MorphMany 而是使用MorphOne 奇怪的是,我在 Laravel 的文档中找不到它,尽管该方法本身存在于 Eloquent 关系中。
这个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);
}
这是一侧 Address 和 User[=25 之间的 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);
简介:
我有这些表格及其模型:
- 地址table --> 地址模型
- 用户table --> 用户模型
- 公司table --> 公司型号
- 属性table --> 属性模型
规则:
- 每个用户只能有一个地址。
- 每个公司只能有一个地址。
- 每个属性只能有一个地址。
这里可以进行两种可能的关系规划:
用户hasOne地址和地址belongsTo用户[即一对一关系] 但缺点是这里的外键位于地址 table 即 user_id 字段并通过与其他重复相同的关系模型 [Company and 属性] 我们将在地址 table 中获得另外两个外键,它们是 [company_id 和 property_id],那么我们最终会得到 3 个模型的 3 个外键但是 每一行只会填充一个 记录总是留下两个外键字段留空
我觉得这是对地址 table 的间接费用。
或反过来:
- 地址hasOne用户和用户belongsTo 地址[一对一的关系也]。这样做的好处是它在相关模型中保留外键,即 [User, Company and 属性] 这样就没有外键的空字段 --- 但这仍然违反现实生活中的建模逻辑这表明 User hasOne Address 多于 Address hasOne用户。
我的问题:
是否有任何其他关系可以将这 4 个模型绑定在一个类似于多态关系的关系中,但不使用 MorphMany 而是使用MorphOne 奇怪的是,我在 Laravel 的文档中找不到它,尽管该方法本身存在于 Eloquent 关系中。
这个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);
}
这是一侧 Address 和 User[=25 之间的 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);