2016-02-29 3 views
0

Я хотел бы выполнить следующий запрос, где я бы хотел прочитать только необходимые поля из связанных.
Я использовал точечную нотацию в select() ниже, чтобы лучше объяснить, что я хочу.
В основном select(), по-видимому, относится только к Users. Можно ли указать поля Sites?Как выбрать поля объединенной ассоциации?

$orders = $this->Orders->find() 
    ->contain([ 
     'Sites.Users'=> function ($q) { 
      return $q 
       ->select([ 
        'Sites.id', 
        'Sites.user_id', 
        'Users.id', 
        'Users.name', 
        'Users.owner_id', 
        'Users.firstname', 
        'Users.lastname' 
       ]) 
       ->autoFields(false); 
     }, 
    ]) 
    ->first(); 

ответ

3

Вы должны индивидуально настраивать защитные оболочки, выбирая поля для других защитных оболочек, работать не будет.

Чтобы быть точным, вы не можете выбрать поля для удержания из где-нибудь еще, чем соответствующей конфигурации оболочки, с единственным исключением belongsTo/hasOne ассоциаций, которые используют стратегию соединения, поля для них могут быть выбраны в select() зове немедленный «родительский» запрос, так как эти ассоциации будут извлекаться через соединение в этом запросе.

Если, например Sites было бы belongsTo ассоциацию, то вы можете выбрать поля для него с помощью select() вызова на Orders. Если Users будет belongsTo, но Sites a hasMany, то вы можете использовать select(), чтобы позвонить по телефону Sites, чтобы выбрать поля для Users.

Это, как говорится, в вашем случае вы либо использовать опцию queryBuilder для определения обратных вызовов в вложенной структуре массива

contain([ 
    'Sites' => [ 
     'queryBuilder' => function ($q) { 
      return $q 
       ->select([ 
        'Sites.id', 
        'Sites.user_id' 
       ]); 
     }, 
     'Users' => function ($q) { 
      return $q 
       ->select([ 
        'Users.id', 
        'Users.name', 
        'Users.owner_id', 
        'Users.firstname', 
        'Users.lastname' 
       ]); 
     } 
    ] 
]) 

или, если вы на самом деле не нужен конструктор запросов, используйте опцию fields

contain([ 
    'Sites' => [ 
     'fields' => [ 
      'Sites.id', 
      'Sites.user_id' 
     ], 
     'Users' => [ 
      'fields' => [ 
       'Users.id', 
       'Users.name', 
       'Users.owner_id', 
       'Users.firstname', 
       'Users.lastname' 
      ] 
     ] 
    ] 
]) 

Смотрите также

+0

ок спасибо много для этих Infos. – 2ndGAB