Laravel 中的多态关系问题
Problem with Polymorphic Relationships in Laravel
我正在尝试实现一种方法来根据某个人所属的组获取该人的详细信息。
我的数据库看起来像这样:
人:
id
group
type
1
person
9
2
company
30
3
person
9
等等。
每个“组”都有一个模型,其中包含该组特定记录的详细信息。
例如:
persondetails 看起来像这样
id
person_id
firstname
lastname
birthname
1
1
Harry
Example
Bornas
2
3
Henrietta
Example
Bornas
我为每个 table 创建了模型,并且我没有尝试实现允许我通过 person 模型查询 person->with('details') 的关系(例如:以获得所有人员的完整列表,无论是哪种类型)。
对于单个记录,我通过一个简单的“if $this->group === person {$this->hasOne()}”关系让它工作,这不适用于列表。
我试图想出一种使用多态关系的方法,所以我将以下内容放入人员模型中:
public function details(){
Relation::morphMap([
'person' => 'App\Models\Persondetail',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo();
}
和随后的
public function person(){
return $this->morphMany(Person::class, 'details');
}
可悲的是,这不起作用。我的思维错误在哪里?
由于您没有使用 laravel 键约定,您需要在关系中定义键
public function details()
{
Relation::morphMap([
'person' => 'App\Models\Persondetail',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo(__FUNCTION__, 'group', 'type');
}
文档 Link:
https://laravel.com/docs/9.x/eloquent-relationships#morph-one-to-one-key-conventions
根据 https://whosebug.com/users/8158202/akhzar-javed 的回复,我弄明白了,但我不得不稍微更改一下代码:
我不得不使用以下代码而不是答案中的代码:
public function details()
{
Relation::morphMap([
'person' => 'App\Models\Persondetails',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo(__FUNCTION__, 'group', 'id', 'person_id');
}
我正在尝试实现一种方法来根据某个人所属的组获取该人的详细信息。 我的数据库看起来像这样: 人:
id | group | type |
---|---|---|
1 | person | 9 |
2 | company | 30 |
3 | person | 9 |
等等。
每个“组”都有一个模型,其中包含该组特定记录的详细信息。
例如:
persondetails 看起来像这样
id | person_id | firstname | lastname | birthname |
---|---|---|---|---|
1 | 1 | Harry | Example | Bornas |
2 | 3 | Henrietta | Example | Bornas |
我为每个 table 创建了模型,并且我没有尝试实现允许我通过 person 模型查询 person->with('details') 的关系(例如:以获得所有人员的完整列表,无论是哪种类型)。 对于单个记录,我通过一个简单的“if $this->group === person {$this->hasOne()}”关系让它工作,这不适用于列表。
我试图想出一种使用多态关系的方法,所以我将以下内容放入人员模型中:
public function details(){
Relation::morphMap([
'person' => 'App\Models\Persondetail',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo();
}
和随后的
public function person(){
return $this->morphMany(Person::class, 'details');
}
可悲的是,这不起作用。我的思维错误在哪里?
由于您没有使用 laravel 键约定,您需要在关系中定义键
public function details()
{
Relation::morphMap([
'person' => 'App\Models\Persondetail',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo(__FUNCTION__, 'group', 'type');
}
文档 Link:
https://laravel.com/docs/9.x/eloquent-relationships#morph-one-to-one-key-conventions
根据 https://whosebug.com/users/8158202/akhzar-javed 的回复,我弄明白了,但我不得不稍微更改一下代码:
我不得不使用以下代码而不是答案中的代码:
public function details()
{
Relation::morphMap([
'person' => 'App\Models\Persondetails',
'company' => 'App\Models\Companydetail',
]);
return $this->morphTo(__FUNCTION__, 'group', 'id', 'person_id');
}