Laravel多态关系得到混合集合
我有一个应用程序,它有一个页面,可以有多个块类型以特定顺序链接到它。 我定义了以下数据结构:Laravel多态关系得到混合集合,laravel,collections,polymorphism,relationship,Laravel,Collections,Polymorphism,Relationship,我有一个应用程序,它有一个页面,可以有多个块类型以特定顺序链接到它。 我定义了以下数据结构: page - id - title block1 - id - title block2 - id - title page_blocks - id - page_id - block_id - block_type - weight 在页面内部,我定义了2个多态关系,允许我将块链接到页面,如下所示: Cla
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]]);
$page = \App\Models\Page::with(['block1','block2'])->find(1);
在这种情况下,我希望有以下布局:类型为“Block 1”的项,后面是类型为“Block 2”的项,后面是类型为“Block1”的另一项
如果我想获取块,我可以按如下类型分别获取它们:
$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]]);
$page = \App\Models\Page::with(['block1','block2'])->find(1);
我想知道是否有一种方法可以通过多态关系获得所有块,并在使用以下两个块后,按重量顺序获得块1和块2项目的混合集合:
$page = \App\Models\Page::with(['block1','block2'])->find(1);
然后,您只需使用收集函数对其进行浓缩和排序:
$blocks = $page->block1->concat($page->block2)
->sortBy('weight');
您可以在此处了解有关concat方法的更多信息: