Выбор только определённых столбцов через связи hasOne, hasMany

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

Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

Добрый день. Подскажите такой момент. Есть связи вида

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

    public function getContentArticles() {
        return $this->hasMany(Articles::className(), ['id' => 'articles_id'])->viaTable('rel_content_articles',
                ['content_id' => 'id']);
    }
    
    public function getWords() {
        return $this->hasOne(Words::className(), ['id' => 'words_id']);
    }    
Через промежуточную таблицу, или напрямую, не столь важно. Судя по дампу (и по запросу в дебаге), если сделать так:

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

$articles = $this->contentArticles;
то выбираются все поля в связанной таблице Articles, и дальше можно получить к ним доступ через геттеры полей. А можно ли выбрать только определённые поля? Выбирать все нецелесообразно из за большого объема текстовых данных...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение zelenin »

->getContentArticles(function($query) {
return $query->select(...);
})->...

не стесняемся читать документацию.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение caHek2x »

ну или если делаете жадную загрузку то

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

with(['contentArticles'=>function($query) {
   return $query->select(...);
}])
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

Это вот тут описано, верно?
Всё равно не въеду, как прикрутить к реальной жизни :oops:
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение caHek2x »

всмысле не въедете ... выше примеры из "реальной жизни" ...
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

в модели Content пишу

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

$articles = Content::find()->with([
            'contentArticles' => function(\yii\db\ActiveQuery $query) {
                $query->select(['id', 'title']);
            }
        ])->all();
но результат неверный
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение ElisDN »

azz писал(а): 2017.10.19, 11:38 но результат неверный
Какой результат получился? И какой должен быть верный?
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

ElisDN писал(а): 2017.10.19, 12:23 Какой результат получился? И какой должен быть верный?
когда я пишу

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

$articles = $this->contentArticles;
то получаю массив статей, связанных с заданным в модели content id
когда я пишу

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

$articles = Content::find()->with([
            'contentArticles' => function(\yii\db\ActiveQuery $query) {
                $query->select(['id', 'title']);
            }
        ])->all();
то получаю массив с полным содержимым таблицы content, в элементах которого есть массивы связанных статей. Изначально я спрашивал как всё таки получить результат, аналогичный $this->contentArticles, но с нужным мне набором полей, а не с их полной выборкой.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

zelenin писал(а): 2017.10.19, 14:15 $articles->contentArticles
Trying to get property of non-object что не удивительно, ведь его там нет, и вообще это массив
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

Экспериментальным путём таки нашел решение

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

    public function getContentArticles() {
        return $this->hasMany(Articles::className(), ['id' => 'articles_id'])->select(['id', 'title'])->viaTable('rel_content_articles',
                ['content_id' => 'id']);
    }
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение zelenin »

azz писал(а): 2017.10.19, 14:42
zelenin писал(а): 2017.10.19, 14:15 $articles->contentArticles
Trying to get property of non-object что не удивительно, ведь его там нет, и вообще это массив
в смысле foreach($articles as $article) { $article->contentArticles ... }
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

zelenin писал(а): 2017.10.19, 14:55 в смысле foreach($articles as $article) { $article->contentArticles ... }
а зачем такие сложности? Во-первых, ненужная выборка всей таблицы content, во-вторых, нужно делать foreach, искать текущий айди модели, потом уже вытаскивать из него инфу...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение zelenin »

azz писал(а): 2017.10.19, 16:29
zelenin писал(а): 2017.10.19, 14:55 в смысле foreach($articles as $article) { $article->contentArticles ... }
а зачем такие сложности? Во-первых, ненужная выборка всей таблицы content, во-вторых, нужно делать foreach, искать текущий айди модели, потом уже вытаскивать из него инфу...
это я ваш код взял:

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

$articles = Content::find()->with([
            'contentArticles' => function(\yii\db\ActiveQuery $query) {
                $query->select(['id', 'title']);
            }
        ])->all()
значит в данном случае не $articles будет, а $contents, у которых будет contentArticles
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение caHek2x »

вы сформулируйте конкретнее что вы хотите ...
вам надо получить все contentArticles определенного Content ?
или что ? ато вы сами приводите в пример запрос где вы достаете все Content .. .а потом сами возмущаетесь: "ненужная выборка всей таблицы content"
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: Выбор только определённых столбцов через связи hasOne, hasMany

Сообщение azz »

caHek2x писал(а): 2017.10.19, 19:23 вы сформулируйте конкретнее что вы хотите ...
вам надо получить все contentArticles определенного Content ?
или что ? ато вы сами приводите в пример запрос где вы достаете все Content .. .а потом сами возмущаетесь: "ненужная выборка всей таблицы content"
если вы посмотрите первый пост темы, то увидите ответ на свой вопрос. Весь контент я достаю, потому что мне дали такой код, а не потому что мне это надо
Ответить