Laravel 5与数据透视表的多态关系

时间:2015-07-13 14:43:15

标签: polymorphism eloquent laravel-5

我有以下表格: 不同的内容类型:content1,content2 数据透视表:content_module 不同的模块类型:module1,module2

我正在尝试在内容*表和模块*表之间建立关系,以便每个内容可以按任何顺序混合任何模块。

例如: content1可以有module1,module1,module2,module1,module2,module2

任何人都可以推荐解决此问题的最佳方法。我应该使用多态关系还是原始查询?

如果我可以使用多态关系,我可以看一个例子吗?

1 个答案:

答案 0 :(得分:2)

我最终在内容模型的存储库中编写了自己的函数getModules()。

public function getModules() {
    $contentableType = get_class($this->model); // this includes model's namespace like mynamespace\Content
    $contentModules = DB::table('content_modules')
                    ->select(['moduleable_id', 'moduleable_type'])
                    ->where('status', 1)
                    ->where('contentable_id', $this->model->id)
                    ->where('contentable_type', $contentableType)
                    ->orderBy('position', 'asc')
                    ->get();
    $modules = [];
    foreach ($contentModules as $cm) {
        $model = App::make('mynamespace\\' . $cm->moduleable_type);
        $record = $model->find($cm->moduleable_id);
        $modules[] = [
            'type' => strtolower($cm->moduleable_type),
            'data' => $record,
        ];
    }
    return $modules;
}

这必须在一个查询中完成,以从content_modules中选择记录,然后为每个记录,一个单独的查询从相应的表中检索模块。这假设每个模块都有自己的表,每个表都有不同的列。