Laravel多态关系得到混合集合

时间:2019-01-23 15:13:55

标签: laravel collections polymorphism relationship

我有一个应用程序,该应用程序的页面可以按特定顺序链接到多种块类型。 我定义了以下数据结构:

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]]);

在这种情况下,我希望具有以下布局:类型为“块1”的项目,然后是类型为“块2”的项目,然后是另一个类型为“块1”的项目。

如果我想获取块,可以按如下类型分别获取它们:

$page = \App\Models\Page::with(['block1','block2'])->find(1);

我想知道是否存在一种通过多态关系获取所有块并按权重顺序混合获取Block1和Block2项目的方法

1 个答案:

答案 0 :(得分:1)

两个块都使用后:

$page = \App\Models\Page::with(['block1','block2'])->find(1);

然后,您可以使用集合函数来连接它们并对其进行排序:

$blocks = $page->block1->concat($page->block2)
                       ->sortBy('weight');

您可以在此处了解有关concat方法的更多信息:https://laravel.com/docs/5.7/collections#method-concat

相关问题