Есть таблица Article(id, id_status, descr, ...) и таблица Status(id, code, descr)
В MySQL делаю:
SELECT article.id, article.id_status, article.descr, status.code, status.descr AS sd
FROM article
LEFT JOIN status ON article.id_status = status.id
WHERE status.code = 4;
Это работает. В ActiveRecord:
// Article.php
public function getArtStatus()
{
return $this->hasOne(Status::className(), ['id' => 'id_status']) ->inverseOf('articles');
}
// Status.php
public function getArticles()
{
return $this->hasMany(Article::className(), ['id_status' => 'id']);
}
Далее в ArticleController я возвращаю свой ActiveDataProvider:
...
return new ActiveDataProvider([
'query' => $model->find()
->select([
'{{article}}.name',
'{{article}}.descr',
'{{article}}.id_status',
'{{article}}.createDt',
'{{status}}.code',
'{{status}}.descr AS sd'])
->joinWith(['artStatus'])
->andWhere('{{status}}.scode = :code', [':code' => $code])
->orderBy('{{article}}.createDt'),
]);
В итоге приходит JSON, в котором нет полей из Status. Как все таки их вытащить?
И еще, если сделать так:
.....
'{{article}}.descr AS ad', // или 'ad' => '{{article}}.descr'
.....
'{{status}}.code',
'{{status}}.descr'])
то в ответе появляется status.descr, а article.descr пропадает. Какая-то уличная магия. Другие поля из Status не попадают в ответ вообще никак.
Что неправильно?
В лог MySQL попадает такое:
SELECT COUNT(*)
FROM `article`
LEFT JOIN `status` ON `article`.`id_status` =
`status`.`id`
WHERE `status`.code = 4
SHOW FULL COLUMNS FROM `article`
SELECT
SELECT `article`.name, `article`.createDt, `article`.descr, `article`.id_status,
`status`.code, `status`.descr AS `sd`
FROM `article`
LEFT JOIN `status` ON `article`.`id_status` = `status`.`id`
WHERE `status`.code = 4
ORDER BY `article`.createDt LIMIT 20
SELECT * FROM `status` WHERE `id`=4
SHOW FULL COLUMNS FROM `status`
SELECT