-1

在查询多态关系存在或不存在时,Laravel Eloquent 提供了真正有助于创建与类型相关的查询的方法whereHasMorphwhereDoesntHaveMorph但是对于急切的负载呢?

情况如下:

考虑 3 个模型App\PhotosApp\VideosApp\Blogs

这三个模型都是可馈送的,这意味着它们与App\Feed模型具有多态关系。

但是虽然App\PhotosApp\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、反应、评论、分享等都是不同的模块,网站所有者可以禁用或删除它们。因此,当开发人员创建模块时,他们必须考虑到反应、评论等模块可以被禁用或删除。

4

1 回答 1

1

1- Laravel 中的命名约定指出模型是单数形式,因此您可以考虑将模型重命名为PhotoVideo

2-在您的情况下,Blog模型没有反应,因此您可以type在模型中创建一个范围,Feed例如:

public function scopeHasReactions($query)
{
    return $query->whereIn('reactable_type', ['App\Photo', 'App\Video']);
}

3-使用$withCount属性来获取计数,Photo在示例中的模型中:

protected $withCount = ['reactions'];

最后,您可以进行如下查询:

$feeds = Feed::hasReactions()->get();

$feeds->first()->reactions_count;

希望这可以帮助。

于 2019-09-24T08:41:20.877 回答