如何在查询生成器上使用Hash导致CakePHP 3.x?

时间:2015-03-15 08:08:43

标签: cakephp cakephp-3.0

这是我的代码

$all = $this->find()
        ->select(['ProductCircles.id', 'ProductCircles.type', 'ProductCircles.name'])
        ->order(['ProductCircles.type'])
        ->all()
        ->toArray();

        Log::write('error', $all);

        $all = Hash::combine($all, '{n}.ProductCircles.id', '{n}.ProductCircles.name', '{n}.ProductCircles.type');

$all是一个ProductCircle实体数组。

但是,Hash组合无法像我预期的那样对数据进行操作。

请告知。

预计

$all是一个ProductCircle实体数组:

2015-03-15 08:04:36 Error: Array
(
    [0] => App\Model\Entity\ProductCircle Object
        (
            [_accessible:protected] => Array
                (
                    [name] => 1
                    [type] => 1
                    [product_count] => 1
                    [products_in_circles] => 1
                )

            [_properties:protected] => Array
                (
                    [id] => 27
                    [type] => MATERIAL
                    [name] => Wood
                )

            [_original:protected] => Array
                (
                )

            [_hidden:protected] => Array
                (
                )

            [_virtual:protected] => Array
                (
                )

            [_className:protected] => App\Model\Entity\ProductCircle
            [_dirty:protected] => Array
                (
                )

            [_new:protected] => 
            [_errors:protected] => Array
                (
                )

            [_registryAlias:protected] => ProductCircles
        )

这是我的预期。

我想用Hash :: combine做的是得到一个像这样的数组:

$result:
    [
        [MATERIAL] => [
                [27] => [
                        Wood
                ]
        ]

2 个答案:

答案 0 :(得分:1)

不要使用Hash,而是使用查询对象中内置的集合方法:

$combined = $this->find()
    ->select(['ProductCircles.id', 'ProductCircles.type', 'ProductCircles.name'])
    ->order(['ProductCircles.type'])
    ->combine('id', 'name', 'type')
    ->toArray();

答案 1 :(得分:0)

扩展 José 的回答(并使用 extract(),因为这是我需要的):

$query = $this->MyTable->find('all', [
    'contain' => [
        'ProductCircles',
    ],
    // ...
]);
return $query->all()->extract('ProductCircles.name');

更多信息:book.cakephp.org/3/en/core-libraries/collections.html#Cake\Collection\Collection::extract