2016-07-26 4 views
0

사용자 모델은 관계에 따라 있습니다Yii2 hasMany의이

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

찾기 방법 : I 설정 결과에 uw.staff_id없이 데이터를 얻을 필요

$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() 
      ; 

? 후 처리없이 가능합니까?

업데이트 : 내가 배열 매개 변수로 "작업"을 필요로하지만, 후 처리를 사용하고 단지 결과 집합에서 "staff_id"을 배제하지 않는 enter image description here

이 결과 세트입니다.

원시 SQL : ActiveQuery 합류 관계에 대한 중첩 된 배열을 구축하는 중첩 된 쿼리 결과에서 외래 키를 검색하기 때문에

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

게시물을 업데이트합니다. 업데이트 섹션을보십시오. $ staffs는 배열입니다. 내가 잊어 버린 포함 -> asArray() -> all() – johndoek

답변

1

당신은 어떤 후 처리없이 YII에서 할 수 없습니다.

당신을 위해 가장 편리한 방법은 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);