如何通过存储在子关系中的订单字段来订购父项

时间:2017-08-13 14:43:38

标签: laravel laravel-5

我与3个模特有这种关系

Content (1)
  ContentBlocks (many blocks belong to Content)
    ContentBlockSettings (many settings belong to ContentBlock)

我需要从DB获取ContentBlocks并对它们进行排序,我有一个名为order的字段,它存储在每个块的ContentBlockSettings中。

如何从数据库中取回ContentBlocks,并按照存储在子关系中的订单字段对它们进行排序。

请不要告诉我将订单字段移到ContentBlocks,我知道这将是最简单的方法,但有非常具体的原因,我不能在我的应用程序中执行此操作。

所以,如果可以通过存储在子关系中的'order'字段订购ContentBlocks,你能告诉我吗?如果可能的话,你能告诉我怎么做吗?

更新

    foreach ($content->blocks as $key => $block) {
            $title = $block->settings;
            foreach ($block->settings as $key => $setting) {
                // dump('we here: ' . $setting['key']);
                if($setting['key'] == 'order') {
                    $block->order = (int)$setting['value'];
                    break;
                }
            }
    }


$content->blocks = $content->blocks->sortBy('order');

    return response()->json([
        'status' => 'success',
        'blocks' => $content->blocks
    ], 201);

如果我发表评论// $ content-> blocks = $ content-> blocks-> sortBy('order');

返回给客户的是:

enter image description here

如果再次启用该行,则返回的是: enter image description here

注意区别?在第一个图像块是数组,有[在乞讨,如果你仔细观察,并在第二个屏幕没有[,有长度:第一个3,第二个屏幕没有长度

也: enter image description here 如您所见,图像块的顺序为3,标题块的顺序为2

即使认为它们是在服务器上订购的,sortBy('order')也没有改变数组键,所以当我在服务器上dd($ content-> blocks)时,我确定

0 => TitleBlock
2 => HeaderBlock
1 => ImageBlock

这是在dd()时打印的内容,正如您所看到的,ImageBlock仍为1,而HeaderBlock在数组中仍为2。

我如何解决这个问题,以便客户获得正确的订单?

1 个答案:

答案 0 :(得分:0)

您可以使用sortBy收集方法

$collection = collect([
    ["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
    ["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
    ["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
    ]);

$sorted = $collection->sortBy("product.price")->toArray();

return: [
  ["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
  ["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
  ["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
]