SQL запрос через ActiveRecord выдаёт только поля своей модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

И снова здравствуйте. Ни дня без вопроса :)
Есть модель ActiveRecord, в ней делаю простой запрос:

Код: Выделить всё

    public function getAllSitesGroups() {
//        return $this->find()
//                ->leftJoin('{{%rel_sites_sgroups}}', '{{%sites}}.id={{%rel_sites_sgroups}}.site_id')
//                ->orderBy(['{{%sites}}.name' => SORT_ASC])
//                ->all();
        return $this->findBySql('
SELECT *
FROM sites AS s
LEFT JOIN rel_sites_sgroups AS r
ON s.id=r.site_id
ORDER BY s.name')->all();
    }
на выходе получаю только те поля, которые есть в таблице sites:

Код: Выделить всё

app\models\Sites#1
(
    [yii\db\BaseActiveRecord:_attributes] => [
        'id' => '3'
        'name' => 'Колбаса \"Дружок\"'
        'url' => 'best-korean-sausage.com'
    ]
 ......
Почему так и как получить ВСЕ поля из ВСЕХ таблиц?
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение phpshko »

если устроит результат массивом, то можно добавить ->asArray()->all(); .
Но только учтите что если в разных таблицах будут колонки с одинаковыми именами, в выборку попадет только одна из них
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

phpshko писал(а): 2017.07.26, 17:22 если устроит результат массивом, то можно добавить ->asArray()->all(); .
Но только учтите что если в разных таблицах будут колонки с одинаковыми именами, в выборку попадет только одна из них
asArray() выдаёт то же самое

Код: Выделить всё

[
    'id' => '3'
    'name' => 'Колбаса \"Дружок\"'
    'url' => 'best-korean-sausage.com'
]
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение dmg »

Надо создать публичные поля, отсутствующие в таблице модели и переопределить их в запросе.
Как то так:

Код: Выделить всё

public $rname;
public $rfield1;
public $rfield2;

Код: Выделить всё

SELECT s.*, r.name rname, r.field1 rfield1, r.field2 rfield2
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение phpshko »

azz писал(а): 2017.07.26, 17:37
phpshko писал(а): 2017.07.26, 17:22 если устроит результат массивом, то можно добавить ->asArray()->all(); .
Но только учтите что если в разных таблицах будут колонки с одинаковыми именами, в выборку попадет только одна из них
asArray() выдаёт то же самое

Код: Выделить всё

[
    'id' => '3'
    'name' => 'Колбаса \"Дружок\"'
    'url' => 'best-korean-sausage.com'
]
Странно. у меня такой код возвращает все колонки

Код: Выделить всё

Account::findBySql('SELECT *, "wer" as wwrwr
FROM account AS a
LEFT JOIN account_project AS ap ON a.id=ap.account_id')
->asArray()->one()
Idaho
Сообщения: 58
Зарегистрирован: 2017.04.24, 08:06

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение Idaho »

тут гляньте viewtopic.php?f=19&t=44154&p=220214
может чего найдете полезное
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

dmg писал(а): 2017.07.26, 17:38 Надо создать публичные поля, отсутствующие в таблице модели и переопределить их в запросе.
как-то это неправильно, ИМХО... Ну и попробовал, не работает всё равно.
Idaho писал(а): 2017.07.26, 19:19 тут гляньте viewtopic.php?f=19&t=44154&p=220214
может чего найдете полезное
не нашел...

Заметил, что если писать так:

Код: Выделить всё

        return $this->find()
                ->leftJoin('{{%rel_sites_sgroups}}', '{{%sites}}.id={{%rel_sites_sgroups}}.site_id')
                ->orderBy(['{{%sites}}.name' => SORT_ASC])
                ->asArray()
                ->all();
то в дебагере выполняется запрос

Код: Выделить всё

SELECT `sites`.* FROM `sites` LEFT JOIN `rel_sites_sgroups` ON `sites`.id=`rel_sites_sgroups`.site_id ORDER BY `sites`.`name`
а если через findBySql, то запрос выполняется именно такой какой прописан. Но в выдаче тем не менее поля из таблицы sites отсутсвуют. На всякий случай, вот код в контроллере:

Код: Выделить всё

    public function actionView($id) {
        $sites = new \app\models\Sites();
	$result = $sites->getAllSitesGroups();
....	
Контроллер, если что, не Site, другой.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

забыл добавить, если выполнять запрос через Yii::$app->db->createCommand($sql)->queryAll() то всё работает
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение Alexum »

azz писал(а): 2017.07.26, 17:05 Есть модель ActiveRecord...
А что мешает сгенерировать ещё одну модель для rel_sites_sgroups, прописать связь и подтягивать связанные данные через ->with() ?
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

Alexum писал(а): 2017.07.27, 15:03
azz писал(а): 2017.07.26, 17:05 Есть модель ActiveRecord...
А что мешает сгенерировать ещё одну модель для rel_sites_sgroups, прописать связь и подтягивать связанные данные через ->with() ?
ничего, кроме того факта что плодить модели для связующих таблиц не хочется. Ну опять же хочется разобраться, куда деваются поля в выдаче.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение Alexum »

Работая с ActiveRecord нужно понимать, что большинство методов нацелено на возврат данных по конкретной модели. Всё равно, что вы пропишите в поисковом запросе - вернут вам только объекты/данные той модели, для которой инициируете поисковый запрос, хоть вы 10 джоинов пропишите. Хотите нормальную работу с AR - добавляйте модель для связанных данных. Иначе лучше будет напрямую воспользоваться Yii::$app->db->createCommand().
Фриз
Сообщения: 85
Зарегистрирован: 2012.01.20, 17:23

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение Фриз »

azz писал(а): 2017.07.27, 15:18
Alexum писал(а): 2017.07.27, 15:03
azz писал(а): 2017.07.26, 17:05 Есть модель ActiveRecord...
А что мешает сгенерировать ещё одну модель для rel_sites_sgroups, прописать связь и подтягивать связанные данные через ->with() ?
ничего, кроме того факта что плодить модели для связующих таблиц не хочется. Ну опять же хочется разобраться, куда деваются поля в выдаче.
"Связывание посредством промежуточной таблицы"?
http://stuff.cebe.cc/yii2docs-ru/guide- ... tion-table
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

Alexum писал(а): 2017.07.27, 15:32 Работая с ActiveRecord нужно понимать, что большинство методов нацелено на возврат данных по конкретной модели. Всё равно, что вы пропишите в поисковом запросе - вернут вам только объекты/данные той модели, для которой инициируете поисковый запрос, хоть вы 10 джоинов пропишите. Хотите нормальную работу с AR - добавляйте модель для связанных данных. Иначе лучше будет напрямую воспользоваться Yii::$app->db->createCommand().
Ок. Сделал промежуточную модель. Как мне теперь сделать нужный запрос? Не соображу.
"Связывание посредством промежуточной таблицы"?
да, я читал. Такая связь есть, но мне в данном случае надо получить все сайты и сделать leftjoin с промежуточной таблицей, что бы знать каких сайтов в ней нет. Кстати связывание работает без промежуточной модели.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение Alexum »

azz писал(а): 2017.07.27, 16:04 Ок. Сделал промежуточную модель. Как мне теперь сделать нужный запрос? Не соображу.

Код: Выделить всё

ModelClassName::find()->with('названиеСвязи')->all();
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение mkramer »

На ActiveRecord свет клином не сошёлся. Если его не хватает, используйте обычные запросы, Query Builder и т.п.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: SQL запрос через ActiveRecord выдаёт только поля своей модели

Сообщение azz »

так и сделал в результате
Ответить