Вернуть связанные модели в выборке Rest

Всё что касается построения API
Закрыто
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

Всем привет.

Есть модель со связанными данными:
Invoice->User->Role

Как при выборке моделей Invoice сразу же получить User и Role. Т.е. чтобы при:

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

public function index()
{
	return \app\models\Invoice::find()->all();
}
в ответе было:

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

items : [
	{
		'id' : 1,
		'title' : 'Invoice 1',
		'user' :  {
			'name' : 'Alexander',
			'age' : 25,
			'role' : {
				'name' : 'Admin''
			}
		},
		....
	},
	....
]
?
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Вернуть связанные модели в выборке Rest

Сообщение caHek2x »

наверно вам надо жадная загрузка (with)
https://github.com/yiisoft/yii2/blob/ma ... -загрузка-
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Re: Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

caHek2x писал(а): 2017.03.15, 22:39 наверно вам надо жадная загрузка (with)
https://github.com/yiisoft/yii2/blob/ma ... -загрузка-
Нет, даже если я укажу так:

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

public function index()
{
	return \app\models\Invoice::find()->with(['user', 'user.role'])->all();
}
они не появятся в ответе.

Максимум, что получается сделать, так это получить связанную модель User, с помощью указания в модели Invoices:

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

public function fields()
{
      return array_merge(parent::fields(), ['user']);
}
это уже не работает:

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

public function fields()
{
      return array_merge(parent::fields(), ['user', 'user.role']);
}
Последний раз редактировалось Alexander_S 2017.03.15, 23:00, всего редактировалось 1 раз.
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Re: Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

не хочется получать связанные данные через указание доп. параметра expand, но даже при:

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

public function extraFields()
{
    return ['user.role'];
}
не понятно, что нужно указать в expand, чтобы получить role.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вернуть связанные модели в выборке Rest

Сообщение ElisDN »

Тогда так:

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role' => 'user.role',
    ]);
}
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Re: Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

ElisDN писал(а): 2017.03.16, 07:39 Тогда так:

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role' => 'user.role',
    ]);
}
Нет, увы, ошибки начинают вываливаться:

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

/vendor/yiisoft/yii2/db/BaseActiveRecord.php(286): yii\base\Component->__get('user...')
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вернуть связанные модели в выборке Rest

Сообщение ElisDN »

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role' => 'role',
    ]);
}
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Re: Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

ElisDN писал(а): 2017.03.16, 13:47

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role' => 'role',
    ]);
}
Нет, ведь связанные данные role идут через связь user, соответственно модель Incoice ничего не знает про связанные данные role у user.
Alexander_S
Сообщения: 98
Зарегистрирован: 2015.07.12, 13:27

Re: Вернуть связанные модели в выборке Rest

Сообщение Alexander_S »

Alexander_S писал(а): 2017.03.16, 15:18
ElisDN писал(а): 2017.03.16, 13:47

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role' => 'role',
    ]);
}
Нет, ведь связанные данные role идут через связь user, соответственно модель Incoice ничего не знает про связанные данные role у user.
ммм, все разгадал. Нужно в Invoice модели определить:

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'user',
    ]);
}
и в User модели определить:

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

public function fields()
{
    return ArrayHelper::merge(parent::fields(), [
         'role',
    ]);
}
тогда получаю желаемый результат.

Спасибо.
Закрыто