pix*_*sic 5 php relationship polymorphic-associations laravel eloquent
我基本上有两个相同类型的模型(dog和cat):pets。表pets连接数据库中的所有狗和猫。现在我希望能够通过 PetController 中的 pet id 找到特定的宠物。像这样:
$pet = Pet::findOrFail($id); // returns a dog or cat
Run Code Online (Sandbox Code Playgroud)
表结构:
???????????????? ????????????? ?????????????
? pets ? ? dogs ? ? cats ?
???????????????? ????????????? ?????????????
? id ? ? id ? ? id ?
? related_type ? ? name ? ? name ?
? related_id ? ? eye_color ? ? tail_size ?
???????????????? ????????????? ?????????????
Run Code Online (Sandbox Code Playgroud)
宠物表:
??????????????????????????????????
? id ? related_type ? related_id ?
??????????????????????????????????
? 1 ? dog ? 1 ?
??????????????????????????????????
? 2 ? dog ? 2 ?
??????????????????????????????????
? 3 ? cat ? 1 ?
??????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
我搜索了 Laravel 文档,但似乎没有一个关系适合这个问题。只有多态关系会反过来工作,这样我就可以通过 dog- 或 cat-id 访问宠物模型。但我正在寻找一种相反的解决方案。有没有不需要在 PetController 中手动使用讨厌的 if-else 的关系?
谢谢!
您可以像这样定义这 3 个模型之间的多态关系
宠物模型
public function related(){
$this->morphTo();
}
Run Code Online (Sandbox Code Playgroud)
狗模型
public function pets(){
$this->morphMany('App\Pet', 'related');
}
Run Code Online (Sandbox Code Playgroud)
猫模型
public function pets(){
$this->morphMany('App\Pet', 'related');
}
Run Code Online (Sandbox Code Playgroud)
现在像这样获取它
$pet = Pet::findOrFail($id)->related;
dd($pet); //you will get either cat or dog
Run Code Online (Sandbox Code Playgroud)
轻松创建
$dog = Dog::create(['name'=> 'dog1', 'eye_color' => 'gray']);
$dog->pets()->create();
Run Code Online (Sandbox Code Playgroud)
在此处查看详细信息https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |