Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel多态关系得到混合集合_Laravel_Collections_Polymorphism_Relationship - Fatal编程技术网

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方法的更多信息: