雄辩的活动源 - 共享多态关系

时间:2014-08-13 08:25:39

标签: laravel eloquent

我有一个现有的应用程序,在评论和视频/图像表之间设置了多态关系(视频和图像可以有很多评论):

视频表

- id
- title

图片表

- id
- url

评论表

- id
- parent_id (video or image primary key)
- parent_type (video or image)

现在我的客户已请求向应用添加活动源。 Feed必须提取所有新添加的视频和按排名排序的图片及其评论。

我添加了一个活动表

活动表(新)

-id
-parent_id (video or image primary key)
-parent_type (video or image)
-rank
-metadata 

元数据列包含一些非规范化数据以显示Feed,因此我无需拉入每个视频或图像。

注意:上面是我的应用程序的简化版本。实际上,我只有视频/图像类型。

我如何设置Eloquent以尽可能少的查询获取所有相关评论的所有活动?我真的很想阻止在foreachloop中进行查询。

可以使用活动表的其他数据库方案。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

class Activity extends Eloquent {

    function parent() {
        return $this->belongsTo($this->getParentEloquentClass(), 'parent_id');
    }

    private function getParentEloquentClass() {
        switch ($this->parent_type) {
            case 'video':
                return 'Video'; // or your video model class name
            case 'image':
                return 'Image'; // or your image model class name
            ....
        }
    }
}

class Video extends Eloquent {
    function activities() {
        return $this->hasMany('Activity', 'activity_id');
    }
}

然后,您可以使用您提到的评论查询最新活动:

Activity::with('parent.comments');

我不确定这是否有用,但值得尝试一下。