gpt4 book ai didi

php - Laravel 一个模型和许多模型之间的 Eloquent 关系作为 MorphOne?

转载 作者:可可西里 更新时间:2023-11-01 13:52:10 26 4
gpt4 key购买 nike

简介:

我有这些表格及其模型:

  • 地址表 --> 地址模型
  • 用户表 --> 用户模型
  • 公司表 --> 公司模型
  • 属性表 --> 属性模型

规则:

  • 每个用户只能有一个地址。
  • 每个公司只能有一个地址。
  • 每个属性只能有一个地址。

可以在这里完成两种可能的关系规划:

  • 用户 hasOne 地址和地址 belongsTo 用户 [即一对一关系] 但缺点是这里的外键位于地址表中,即 user_id 字段,通过与其他模型 [Company and Property] 重复相同的关系,我们将得到另外两个地址表中的外键是 [company_idproperty_id],那么我们最终会得到 3 个模型的 3 个外键但是只有一个会由每一行填充 记录总是留下两个外键字段留空

    我觉得这是对地址表的管理费用。

或者反过来:

  • 地址 hasOne 用户和用户 belongsTo 地址 [也是一对一的关系]。这样做的好处是它将外键保留在相关模型中,即 [User, Company and Property] 这样就没有外键的空字段 --- 但这仍然违反了现实生活中的建模逻辑,它规定 < em>User hasOne Address 多于Address hasOne User。

我的问题:

是否有任何其他关系可以将这 4 个模型绑定(bind)在一个类似于多态关系的关系中,但不使用 MorphMany 而是使用 MorphOne奇怪的是,尽管该方法本身存在于 Eloquent Relations 中,但我在 Laravel 的文档中找不到它。

这个 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);
}

最佳答案

这是一侧的 AddressUser 之间的 MorphOne 关系,公司 和另一边的属性(property):

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);

关于php - Laravel 一个模型和许多模型之间的 Eloquent 关系作为 MorphOne?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50790204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com