Laravel - 反向多态关系

pix*_*sic 5 php relationship polymorphic-associations laravel eloquent

我基本上有两个相同类型的模型(dogcat):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 的关系?

谢谢!

rkj*_*rkj 8

您可以像这样定义这 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