Yii2: Как правильно получать данные из нескольких таблиц и как тут правильно работать с join?

Про связанные данные читал, с этим у меня всё получилось замечательно. Единственное не ясны некоторые моменты.
1) Когда я строю связь, то это получается аналог join? Но для чего join и joinWith? Или это используется в ActiveQuery, когда из модели или компонента надо сделать запрос к другой таблице с помощью конструктора запросов? И как вообще правильно тут с джоинами рабоать? Вот такой код не отработал без создания связи (Getting unknown property: common\models\lineage\La2Characters::character_subclasses)
$model = La2Characters::find()
            ->leftJoin('character_subclasses', 'characters.obj_Id = character_subclasses.char_obj_id')
            ->where(['>', 'online', '0'])
            ->all();

Если делаю свзяь
public function getCharacter_subclasses(){
        return $this->hasMany(La2CharacterSubclasses::className(), ['char_obj_id' => 'obj_Id'])->all();
    }

То данные получаю, только в джоине смысл отпадает

2) Когда я делаю связь с другой таблицей, то доступ ко второй таблице у меня только через $obj1->obj2, как мне сделать, что бы вся инфа была в первом объекте?

3) Или я делаю что-то не так или, опять же, не до конца понял концепцию. Когда я дописываю asArray() в самом запроссе, то доступ к связанным данным теряется.
  • Вопрос задан
  • 1607 просмотров
Решения вопроса 1
proudmore
@proudmore
1) Нет, это не аналог джоина. Связь - это геттер для получения связанного через БД AR объекта.
2) Ну можно, конечно, костыльнуть, но зачем это вообще нужно? AR тем и хорош, что каждому объекту соответствует строка в БД, а вы хотите это нарушить и сделать из объекта не пойми что, которое будет содержать в себе какие-то левые данные и никак с ними не работать.
3) Когда вы прописываете asArray, вы получаете не AR объекты, а массивы. У массивов нет метода getCharacter_subclasses(), поэтому доступа к данным и нет.

Метод with() предоставляет вам возможность жадной загрузки. Т.е. вы выбираете ваш AR объект уже со связанным AR объектом. И в дальнейшем, все обращения к этому связанному объекту не будут требовать запроса в БД для выборки данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы