如何在cakephp3中仅获取包含的选定字段

时间:2016-03-20 22:01:14

标签: cakephp cakephp-3.x

我有一个查询如下,但我只需要某些字段而不是所有字段。我已将autoFields设置为false,但查询仍会返回所有字段。

$tenancies = $this
        ->find('all')
        ->autoFields(false)
        ->select([ 
            'Tenancy.id', 'Tenancy.created', 'Tenancy.stage',
            'Properties.id', 'Properties.address1', 'Properties.postcode',
            'Tenants.stage',
        ])
        ->contain('Properties', function(\Cake\ORM\Query $query) {
            return $query->where([
                'Properties.active' => 1
            ]);
        })
        ->contain(['Tenants'])
        ->leftJoinWith('Tenants', function(\Cake\ORM\Query $query) {
            return $query
                ->autoFields(false)
                ->select([
                    'id', 'stage'
                ])
                ->where([
                    'Tenants.active' => 1
                ]);
        })
        ->where([
            'Tenancy.active' => 1,
            $conditions
        ])
        ->order([
            'Tenancy.created' => 'DESC',
            'Tenants.tenancy_id'
        ])
        ->group(['Properties.id'])
        ->autoFields(false); 

    return $tenancies;

Prints =>

object(App\Model\Entity\Tenancy) {

    'id' => (int) 3934,
    'created' => object(Cake\I18n\FrozenTime) {

        'time' => '2016-03-20T18:25:20+00:00',
        'timezone' => 'UTC',
        'fixedNowTime' => false

    },
    'stage' => (int) 2,
    'tenants' => [
        (int) 0 => object(Cake\ORM\Entity) {

            'id' => (int) 8922,
            'user_id' => (int) 56456,
            'tenancy_id' => (int) 3934,
            'needs_guarantor' => true,
            'guarantor_id' => null,
            'holding_fee' => (float) 0,
            ...
            ...

注意:使用matchingleftJoinWith我可以选择我需要的字段,但它不适用于contain

1 个答案:

答案 0 :(得分:6)

主要答案是你需要正确设置关联。一旦正确设置了关联,您就可以像这样简单地打印它。

return $this->find()
                ->select([
                    'Property.id', 'Property.company_id', 'Property.address1', 'Property.address2', 
                    'Property.address3','Property.postcode',  
                ])
                ->contain([                    
                    'Tenancies' => function($q) {
                        return $q
                            ->select([
                                'Tenancies.id','Tenancies.property_id','Tenancies.created',
                                'Tenancies.stage', 
                            ])
                            ->contain([
                                'Tenants' => function($q) {
                                    return $q
                                        ->select([
                                            'Tenants.id', 'Tenants.stage', 'Tenants.tenancy_id', 'Tenants.holding_fee',
                                        ])
                                        ->where([
                                            'active = 1',
                                        ]);
                                    }
                            ])
                            ->contain([
                                'Tenants'  
                            ])
                            ->where([
                                'Tenancies.active = 1',
                            ]);
                    }
                ])
                ->where(['Property.active = 1', $conditions])
                ->toArray();