2016-07-26 10 views
0
модель

Пользователь имеет следовать соотношение:Yii2 hasMany без полей связи

public function getWorkload() : ActiveQuery 
{ 
    return $this->hasMany(ScheduleWorkload::className(), ['staff_id' => 'id']); 
} 

метод Find:

$staffs = User::find() 
      ->alias('u') 
      ->joinWith(['workload as uw' => function($q) { 
       $q->select(['uw.staff_id', 'uw.date', 'uw.time_ranges']); 
      }], true) 
      ->select([ 
       'u.id', 
       'CONCAT(u.first_name, \' \', u.last_name) as name', 
       'u.first_name', 
       'u.last_name', 
       'u.undelivered_messages', 
      ]) 
      ->where(['u.is_staff' => 1]) 
      ->asArray() 
      ->all() 
      ; 

мне нужно получить данные без uw.staff_id в наборе результатов? Можно ли без постобработки?

UPDATE: набор Result, что у меня есть enter image description here

мне нужно «нагрузка» в качестве параметра массива, но не использовать постобработку и просто исключить «staff_id» из результирующего набора.

Сырье SQL:

SELECT `u`.`id`, `u`.`undelivered_messages` 
FROM `user` `u` 
LEFT JOIN `schedule_workload` `uw` ON `u`.`id` = `uw`.`staff_id` 
WHERE `u`.`is_staff`=1 
+0

и какой набор результата вы сейчас? как я вижу, переменная '$ staffs' имеет тип' ActiveQuery'. Что является результатом '$ staffs-> createCommand() -> rawSql'? – oakymax

+0

Я обновляю сообщение. Посмотрите раздел обновления. $ штат - массив. Я забыл включить -> asArray() -> all() – johndoek

ответ

1

Вы не можете сделать в Yii без пост-обработки, поскольку ActiveQuery будет искать внешнего ключа вложенного результата запроса для создания вложенных массивов для совместной связи.

Самый удобный способ для вас, чтобы использовать ArrayHelper:

$staffs = User::find() 
    ->alias('u') 
    ->joinWith(['workload') 
    ->where(['u.is_staff' => 1]) 
    ->all(); 

return \yii\helpers\ArrayHelper::toArray($staffs, [ 
    User::className() => [ 
     'id', 
     'first_name', 
     'last_name', 
     'name' => function ($user) { 
      return $user->first_name . ' ' . $user->last_name 
     }, 
     'undelivered_messages', 
     'workload', 
    ], 
    ScheduleWorkload::className() => [ 
     'date', 
     'time_ranges', 
     'comment' 
    ] 
], true);