serhioli
@serhioli

Как заставить Yii2 получать все поля из связей?

Итак, дано:
* Есть модель A, с определенной связью hasOne на модель B. Обычная принадлежность определенному автору.
* Есть REST-endpoint на который придет клиент и ожидает получить такой JSON:
{
    success: true,
    code: 200,
    data: [{
            id: 1, // <- From table A
            title: "TESTTESTTEST", // <- From table A
            description: "LONGTESTDESCRIPTION", // <- From table A
            username: "IvanBEST" // <- From table B and from field "username"
        },
        {
            id: 2, // <- From table A
            title: "Post #777", // <- From table A
            description: "Lorem ipsum...", // <- From table A
            username: "Oleg222" // <- From table B and from field "username"
        },
        {
            ...
        }
    ]
}


Полей в модели на самом деле много, сейчас хотелось бы хотя бы научить модель резолвить связи, но тут проблема:
public function actionIndex()
    {
        return MyModel::find()->with(['author'])->all();
    }

Возвращает следующий массив JSON:
{
    "success": true,
    "code": 200,
    "data": [
        {
            "id": 1,
            "title": "Faker id5975f7355e568",
            "description": "Voluptas cum incidunt et enim...",
            "author_id": 1, // <--
            "image_id": 1,
            "parent_id": null,
            "created_at": "2017-07-24 16:33:41",
        },
        {
            "id": 2,
            "title": "Faker id5975f7357aa18",
            "description": "Eum dolores eum maxime quos...",
            "author_id": null, // <-- ТУТ ясно
            "image_id": 1,
            "parent_id": null,
            "created_at": "2017-07-24 16:33:41",
        },
]
}

А желаемая конструкция:
return Quest::find()->select(['id', 'title', 'description', 'author.username'])->with(['author'])->all();

... Вообще кидает ошибку в которой видно, что Yii2 не джойнит таблицы.
Делаю так и всплывает главная проблема:
return Quest::find()->alias('t')->select(['t.id', 't.title', 't.description', 'author.username'])->innerJoinWith(['author author'])->all();

...Данный код создает следущий запрос...
SELECT `t`.`id`, `t`.`title`, `t`.`description`, `author`.`username` FROM `tb__quest` `t` INNER JOIN `tb__user` `author` ON `t`.`author_id` = `author`.`id`

...И вроде все хорошо, но в ответе >>>
{
            "id": 1,
            "title": "Faker id5975f7355e568",
            "description": "Voluptas cum incidunt et enim..."
        },
        {
            "id": 2,
            "title": "Faker id5975f735a8923",
            "description": "Eum delectus quis vero laborum ab..."
        },

Вопрос к коллегам - где поле username и где ошибка????
  • Вопрос задан
  • 508 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Если я Вас правильно понял, то вместо ->with надо ->joinWith
return Quest::find()->select(['id', 'title', 'description', 'author.username'])->joinWith(['author'])->all();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Immortal_pony
@Immortal_pony
Добавьте в модель
public $authorName;

И в запросе укажите
->select(['t.id', 't.title', 't.description', 'author.username as "authorName"'])
Ответ написан
@davidnum95
А связь как описана? По сути в author должен был вернуться объект, но никак не id
EDITED: у вас в with передается массив, а должна быть просто строка with('author')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы