php - 模型内的条件关系
问题描述
我有一个包含一unit_id
列和一type
列的模型,2 行可以有相同unit_id
但不同type
的 s。我在模型中有一个方法
public function unit()
{
if ($this->type == 'controller') {
return $this->belongsTo('App\Models\FMS\Controller', 'unit_id', 'id');
} else {
return $this->belongsTo('App\Models\FMS\Unit', 'unit_id', 'id');
}
}
这意味着根据type
列是否等于控制器有条件地返回关系,尽管检查不起作用并且它只返回第二个关系,即使type
是controller
我知道无法$this
在模型中访问,所以我还有其他方法可以解决这个问题吗?
解决方案
$this
将在您的关系方法中可用,但是,如果您急切加载unit
关系(而不是延迟急切加载) type
,则null
. 这是因为在type
建立关系时不会设置属性query
。
如果您在加载初始类后加载关系,则您拥有的代码应该可以工作。
如果您在 Eloquent 集合上使用load(),那么我相信它将使用type
集合中第一个模型上的任何一个。
解决方案
你所拥有的很适合多态关系。
将您的unit()
方法更改为:
public function unit()
{
return $this->morphTo('unit', 'type', 'unit_id');
}
与 Laravel 的多态关系的默认设置是将类的完全限定名称空间作为类型,但由于这种情况下的类型只是controller
或者unit
你需要告诉 Laravel 如何将这些单词映射到相关类. 为此,您可以使用Relation::morphMap()。
在boot()
您AppServiceProvider
(公平地说,它可以是任何服务提供商)的方法中添加以下内容:
Relation::morphMap([
'unit' => 'App\Models\FMS\Unit',
'controller' => 'App\Models\FMS\Controller',
]);
推荐阅读
- docker - 通过 Vagrantfile 安装 Docker
- r - 使用 stringr 将字符对象转换为数字对象
- php - 如何从多个图像源中获取单个图像源
- api - 我可以使用 Google 表格连接到 API(使用 OAuth2)还是可以将 Postman 的每小时预定回复发送到 Google 表格?
- c# - Postgres 拒绝了 Dapper 列表参数
- flutter - 如何在 Flutter 中获取当前连接的 wifi 的 wifi 名称(SSID)
- php - 如何按星期几获得最近的日期?
- javascript - 登录表单的自动完成凭据
- python - Pandas to_datetime:未知的字符串格式
- regex - 匹配不以#、$、开头的变量名的正则表达式