【问题标题】:Laravel Polymorphic relationship get mixed collectionLaravel 多态关系获取混合集合
【发布时间】: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


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2017-10-10
      • 2021-07-10
      • 1970-01-01
      • 2021-06-11
      • 2019-01-04
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多