CakePHP获得一个有序散列作为查询的结果

CakePHP获得一个有序散列作为查询的结果,php,mysql,cakephp,Php,Mysql,Cakephp,我创建了一个使用CakePHP2的web应用程序。我用CakePHP ORM建立了一个查询,但结果并不像我期望的那样。所以我的问题是:是否可以使用CakePHP ORM设置查询以获得我所期望的结果 我的问题是: $addresses = $this->User->Profile->Address->AddressType->find('all', array( 'recursive' => -1, 'joins' => array(

我创建了一个使用CakePHP2的web应用程序。我用CakePHP ORM建立了一个查询,但结果并不像我期望的那样。所以我的问题是:是否可以使用CakePHP ORM设置查询以获得我所期望的结果

我的问题是:

$addresses = $this->User->Profile->Address->AddressType->find('all', array(
    'recursive' => -1,
    'joins' => array(
        array(
            'table' => 'addresses',
            'alias' => 'Address',
            'type' => 'LEFT',
            'conditions' => array(
                'AddressType.id = Address.address_type_id'
            )
        ),
        array(
            'table' => 'profiles',
            'alias' => 'Profile',
            'type' => 'LEFT',
            'conditions' => array(
                'Address.profile_id = Profile.id'
            ),
        ),
        array(
            'table' => 'users',
            'alias' => 'User',
            'type' => 'LEFT',
            'conditions' => array(
                'User.profile_id = Profile.id'
            ),
        )
    ),

    'conditions' => array(
        'User.id' => $id
    ),
    //'group' => array('AddressType.id'),
    'fields' => array(
        'Address.*',
        'AddressType.*',
        'Profile.id',
        'User.id'
    ),
));
以下是我的结果:

array(
    (int) 0 => array(
        'Address' => array(
            'id' => '4',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '1',
            'name' => 'test',
            'zip' => 'test',
            'city' => 'test',
            'street' => 'test',
            'number' => 'test',
        ),
        'AddressType' => array(
            'id' => '1',
            'name' => 'Shipping Address',
            'code' => 'shipping_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 1 => array(
        'Address' => array(
            'id' => '5',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '2',
            'name' => 'test - (invoice)',
            'zip' => 'test',
            'city' => 'test',
            'street' => 'test',
            'number' => 'test',
        ),
        'AddressType' => array(
            'id' => '2',
            'name' => 'Invoice Address',
            'code' => 'invoice_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 2 => array(
        'Address' => array(
            'id' => '6',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '1',
            'name' => 'Test 3',
            'zip' => 'Test 3',
            'city' => 'Test 3',
            'street' => 'Test 3',
            'number' => 'Test 3',
        ),
        'AddressType' => array(
            'id' => '1',
            'name' => 'Shipping Address',
            'code' => 'shipping_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 3 => array(
        'Address' => array(
            'id' => '7',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '4',
            'name' => 'Test 4',
            'zip' => 'Test 4',
            'city' => 'Test 4',
            'street' => 'Test 4',
            'number' => '',
        ),
        'AddressType' => array(
            'id' => '4',
            'name' => 'test_type',
            'code' => 'test_type'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 4 => array(
        'Address' => array(
            'id' => '8',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '1',
            'name' => 'test5',
            'zip' => 'test5',
            'city' => 'test5',
            'street' => 'test5',
            'number' => 'test5',
        ),
        'AddressType' => array(
            'id' => '1',
            'name' => 'Shipping Address',
            'code' => 'shipping_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 5 => array(
        'Address' => array(
            'id' => '9',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '4',
            'name' => 'Tesztecske',
            'zip' => 'Test 41',
            'city' => 'Test 41',
            'street' => 'Test 41',
            'number' => 'test',
        ),
        'AddressType' => array(
            'id' => '4',
            'name' => 'test_type',
            'code' => 'test_type'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 6 => array(
        'Address' => array(
            'id' => '10',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '2',
            'name' => 'test - (invoice)2222758',
            'zip' => 'test',
            'city' => 'test',
            'street' => 'test',
            'number' => 'test',
        ),
        'AddressType' => array(
            'id' => '2',
            'name' => 'Invoice Address',
            'code' => 'invoice_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    ),
    (int) 7 => array(
        'Address' => array(
            'id' => '13',
            'profile_id' => '10',
            'country_id' => '1',
            'address_type_id' => '2',
            'name' => 'sdfgdfgsdfgdsfg',
            'zip' => 'sdfg',
            'city' => 'sdfg',
            'street' => 'sdfgsdfg',
            'number' => 'sdfgsdfg',

        ),
        'AddressType' => array(
            'id' => '2',
            'name' => 'Invoice Address',
            'code' => 'invoice_address'
        ),
        'Profile' => array(
            'id' => '10'
        ),
        'User' => array(
            'id' => '10'
        )
    )
)
所以我想要一个按地址类型名称分组的结果

    array(
    'Shipping Address' =>array(
        (int) 0 => array(
            'Address' => array(
                'id' => '4',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '1',
                'name' => 'test',
                'zip' => 'test',
                'city' => 'test',
                'street' => 'test',
                'number' => 'test',
            ),
            'AddressType' => array(
                'id' => '1',
                'name' => 'Shipping Address',
                'code' => 'shipping_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),

        (int) 1 => array(
            'Address' => array(
                'id' => '8',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '1',
                'name' => 'test5',
                'zip' => 'test5',
                'city' => 'test5',
                'street' => 'test5',
                'number' => 'test5',
            ),
            'AddressType' => array(
                'id' => '1',
                'name' => 'Shipping Address',
                'code' => 'shipping_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),

        (int) 2 => array(
            'Address' => array(
                'id' => '6',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '1',
                'name' => 'Test 3',
                'zip' => 'Test 3',
                'city' => 'Test 3',
                'street' => 'Test 3',
                'number' => 'Test 3',
            ),
            'AddressType' => array(
                'id' => '1',
                'name' => 'Shipping Address',
                'code' => 'shipping_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),
    ),


    'test_type' => array(
        (int) 0 => array(
            'Address' => array(
                'id' => '7',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '4',
                'name' => 'Test 4',
                'zip' => 'Test 4',
                'city' => 'Test 4',
                'street' => 'Test 4',
                'number' => '',
            ),
            'AddressType' => array(
                'id' => '4',
                'name' => 'test_type',
                'code' => 'test_type'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),

        (int) 1 => array(
            'Address' => array(
                'id' => '9',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '4',
                'name' => 'Tesztecske',
                'zip' => 'Test 41',
                'city' => 'Test 41',
                'street' => 'Test 41',
                'number' => 'test',
            ),
            'AddressType' => array(
                'id' => '4',
                'name' => 'test_type',
                'code' => 'test_type'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),

        (int) 2 => array(
            'Address' => array(
                'id' => '5',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '2',
                'name' => 'test - (invoice)',
                'zip' => 'test',
                'city' => 'test',
                'street' => 'test',
                'number' => 'test',
            ),
            'AddressType' => array(
                'id' => '2',
                'name' => 'Invoice Address',
                'code' => 'invoice_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),
    ),
    'Invoice Address' =>array(
        (int) 0 => array(
            'Address' => array(
                'id' => '10',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '2',
                'name' => 'test - (invoice)2222758',
                'zip' => 'test',
                'city' => 'test',
                'street' => 'test',
                'number' => 'test',
            ),
            'AddressType' => array(
                'id' => '2',
                'name' => 'Invoice Address',
                'code' => 'invoice_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        ),
        (int) 1 => array(
            'Address' => array(
                'id' => '13',
                'profile_id' => '10',
                'country_id' => '1',
                'address_type_id' => '2',
                'name' => 'sdfgdfgsdfgdsfg',
                'zip' => 'sdfg',
                'city' => 'sdfg',
                'street' => 'sdfgsdfg',
                'number' => 'sdfgsdfg',

            ),
            'AddressType' => array(
                'id' => '2',
                'name' => 'Invoice Address',
                'code' => 'invoice_address'
            ),
            'Profile' => array(
                'id' => '10'
            ),
            'User' => array(
                'id' => '10'
            )
        )
    )
)

我为此做了一个变通办法,但我很好奇是否可以只使用模型来实现这一点<代码>$addresses=Hash::combine($addresses,{n}.Address.id',{n}',{n}.AddressType.name')
$addresses=$this->User->Profile->Address->Address->AddressType
这看起来很像你控制器中的代码,与你的问题没有直接关系,但应该更像
$foo=$this->User->addresses()
-所有这些代码都在一个模型函数中。要知道,您始终可以使用一个简单的循环,即将$have转换为$want,与使用php的方式相同。