【问题标题】:Eloquent activityfeed - shared polymorphic relationEloquent activityfeed - 共享多态关系
【发布时间】:2014-08-14 15:03:56
【问题描述】:

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

视频表

- id
- title

图片表

- id
- url

cmets 表

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

现在我的客户已请求向应用添加活动源。 Feed 必须拉入所有新添加的视频和图像,并按其 cmets 的排名排序。

我添加了一个活动表

活动表(新)

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

元数据列包含一些用于显示提要的非规范化数据,因此我不必拉入每个视频或图像。

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

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

活动表的其他数据库方案是可能的。

【问题讨论】:

  • 此提要需要什么结果?
  • 什么意思?我想用他们的 cmets 获取 X 数量的活动
  • 我的意思是,你真的需要 Eloquent 结果吗?
  • 是的,我想使用我的演示者/repo/命令等
  • @PinkFloyd 如果您还没有解决问题,请查看polymorphic relations;如果你使用得当,你可以通过这种方式获取 cmets Activities::with('parent.comments')

标签: laravel eloquent


【解决方案1】:

你可以试试这样的:

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');
    }
}

然后你也许可以像你提到的那样使用 cmets 查询最新的活动:

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

我不确定这是否可行,但值得一试。

【讨论】:

  • 我试过这个,但遗憾的是,belongsto 关系只定义了一次。所以如果第一行的parent_type是Video,那么所有连续的行都会和Video表有关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2015-05-19
相关资源
最近更新 更多