【发布时间】:2019-06-17 05:23:09
【问题描述】:
我有一个应用程序,该应用程序的页面可以按特定顺序链接到多个块类型。 我定义了以下数据结构:
page
- id
- title
block1
- id
- title
block2
- id
- title
page_blocks
- id
- page_id
- block_id
- block_type
- weight
在页面内部,我定义了 2 个多态关系,允许我将块链接到页面,如下所示:
Class Page extends Model {
....
public function block1() {
return $this->morphedByMany('App\Models\Block1', 'block', 'page_blocks', 'page_id');
}
public function block2() {
return $this->morphedByMany('App\Models\Block2', 'block', 'page_blocks', 'page_id');
}
}
所以现在我可以向页面添加块,但我必须为每个块使用正确的关系。例如我可以创建一个这样的页面:
$page = \App\Models\Page::firstOrCreate(['id' => 1], ['title' => 'Test']);
$block1 = \App\Models\Block1::firstOrCreate(['id' => 1], ['title' => 'Block 1 title']);
$block1_1 = \App\Models\Block1::firstOrCreate(['id' => 2], ['title' => 'Block 1.1 title']);
$block2 = \App\Models\Block2::firstOrCreate(['id' => 1], ['title' => 'Block 2 title']);
$page->block1()->sync([$block1->id => ['weight' => 1], $block1_1->id => ['weight' => 3]]);
$page->block2()->sync([$block2->id => ['weight' => 2]]);
在这种情况下,我希望有以下布局:“Block 1”类型的项目,然后是“Block 2”类型的项目,然后是“Block1”类型的另一个项目。
如果我想获取块,我可以按如下类型单独获取它们:
$page = \App\Models\Page::with(['block1','block2'])->find(1);
我想知道是否有一种方法可以通过多态关系获取所有块并按重量顺序获取 Block1 和 Block2 项的混合集合
【问题讨论】:
标签: laravel collections polymorphism relationship