在查询多态关系存在或不存在时,Laravel Eloquent 提供了真正有助于创建与类型相关的查询的方法whereHasMorph
。whereDoesntHaveMorph
但是对于急切的负载呢?
情况如下:
考虑 3 个模型App\Photos、App\Videos和App\Blogs。
这三个模型都是可馈送的,这意味着它们与App\Feed模型具有多态关系。
但是虽然App\Photos和App\Videos模型是可反应的(与App\Reactions模型具有多态关系),但App\Blogs模型没有这种关系。
我们来看看方法:
应用\饲料
public function feedable() {
return $this->morphTo();
}
应用\反应
public function reactable() {
return $this->morphTo();
}
应用\照片
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
public function reactions() {
return $this->morphMany('App\Reactions', 'reactable');
}
应用\视频
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
public function reactions() {
return $this->morphMany('App\Reactions', 'reactable');
}
应用\博客
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
在从App\Feed模型查询提要时,我还想获得反应计数。但由于App\Blogs模型没有名为 的方法reactions
,因此此查询会导致错误。
如何创建这样的查询:
$feeds = Feed::with([
'feedable' => function($query) {
// I need to get the feedable_type of the feedable here.
// module_exists is a custom helper to check if an module is installed and active
if ($type != 'App\Blogs' && module_exists('Reactions')) {
$query->withCount('reactions');
}
}
])->all();
编辑
我试图简化我的问题,但我认为我需要提供有关该应用程序的更多信息。
该应用程序是第三方开发人员可以为其开发模块的内容管理系统(社交网络系统)。博客、照片、视频、Feed、反应、评论、分享等都是不同的模块,网站所有者可以禁用或删除它们。因此,当开发人员创建模块时,他们必须考虑到反应、评论等模块可以被禁用或删除。