Выборка определенных полей из связанных таблиц

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

Выборка определенных полей из связанных таблиц

Сообщение Borgir »

Помогите пожалуйста разобраться с поставленной задачей. Есть две таблицы - news и categories. Они связаны между собой таблицей post2cat. В модельке привязал так:

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

class News extends \yii\db\ActiveRecord
{
..........
public function getCategories(){
return $this->hasOne(Categories::className(),['id' => 'cat_id'])->viaTable('post2cat',['new_id' => 'id']); }
}
}
 
В контроллере делаю выборку:

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

public function actionView($id)
    {
        $new = News::find()
        ->with('categories')
        ->where(['url'=>$id])
        ->one();
        return $this->render('view',['new'=>$new]);
    }
 
И вывожу во вьюшке:

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

<div>
<?php echo $new->categories->name;?>
</div>
<div>
<?php echo $new->date;?>
</div>
<div>
<?php echo $new->title;?>
</div>
<div>
<?php echo $new->fulltext;?>
</div>
В таком виде все работает, но из таблиц вытягиваются все поля (и ненужные) для определенной записи. А я хочу выбрать из таблицы news только title, date и fulltext, а из привязанной таблицы categories, только поле name. Как можно указать нужные поля для обеих таблиц?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выборка определенных полей из связанных таблиц

Сообщение zelenin »

зачем юзать для специфической задачи инструмент для этого не предназначенный? AR - представление строки таблицы в виде модели, а не инструмент для получения данных. Ну получите вы не полные модели, как потом эти модели сохранять? в таблице name = 'Post', в модели name = null. Что получите при сохранении? null
Borgir
Сообщения: 6
Зарегистрирован: 2015.11.19, 14:20

Re: Выборка определенных полей из связанных таблиц

Сообщение Borgir »

zelenin писал(а):зачем юзать для специфической задачи инструмент для этого не предназначенный? AR - представление строки таблицы в виде модели, а не инструмент для получения данных. Ну получите вы не полные модели, как потом эти модели сохранять? в таблице name = 'Post', в модели name = null. Что получите при сохранении? null
Задача совсем не специфическая. Нужно вывести страницу новости без возможности редактирования (редактирование будет отдельно в админке), но зачем вытаскивать поля, которые не будут отображаться? Например, поля: автор, время последнего редактирования, кол-во просмотров и тд.. Не хочется вытаскивать лишнее из соображений быстродействия и экономии ресурсов.
Знаю, что нужен select, но не пойму как мне указать определенные поля с разных таблиц
vastzp
Сообщения: 99
Зарегистрирован: 2011.05.17, 16:38

Re: Выборка определенных полей из связанных таблиц

Сообщение vastzp »

Для таблицы news вот так:

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

public function actionView($id)
    {
        $new = News::find()
        ->select(['title', 'date', 'fulltext']) // скорее всего и id категории нужно указать, для того что бы метод getCategories отрабатывал
        ->with('categories')
        ->where(['url'=>$id])
        ->one();
        return $this->render('view',['new'=>$new]);
    }
А как сделать что бы у категорий было только поле name - незнаю.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выборка определенных полей из связанных таблиц

Сообщение zelenin »

Borgir писал(а):
zelenin писал(а):зачем юзать для специфической задачи инструмент для этого не предназначенный? AR - представление строки таблицы в виде модели, а не инструмент для получения данных. Ну получите вы не полные модели, как потом эти модели сохранять? в таблице name = 'Post', в модели name = null. Что получите при сохранении? null
Задача совсем не специфическая. Нужно вывести страницу новости без возможности редактирования (редактирование будет отдельно в админке), но зачем вытаскивать поля, которые не будут отображаться? Например, поля: автор, время последнего редактирования, кол-во просмотров и тд.. Не хочется вытаскивать лишнее из соображений быстродействия и экономии ресурсов.
AR удобен и создан для работы с моделями. Для выборок данных есть другие инструменты. Задача специфична.
Borgir
Сообщения: 6
Зарегистрирован: 2015.11.19, 14:20

Re: Выборка определенных полей из связанных таблиц

Сообщение Borgir »

vastzp писал(а):Для таблицы news вот так:

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

public function actionView($id)
    {
        $new = News::find()
        ->select(['title', 'date', 'fulltext']) // скорее всего и id категории нужно указать, для того что бы метод getCategories отрабатывал
        ->with('categories')
        ->where(['url'=>$id])
        ->one();
        return $this->render('view',['new'=>$new]);
    }
А как сделать что бы у категорий было только поле name - незнаю.
Спасибо большое! С id работает.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выборка определенных полей из связанных таблиц

Сообщение ElisDN »

В связи getCategories() нужен hasMany().
А по полям:

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

->with([
    'categories' => function ($query) { $query->select('name'); }
]) 
Pilot1604
Сообщения: 2
Зарегистрирован: 2016.07.20, 13:51

Re: Выборка определенных полей из связанных таблиц

Сообщение Pilot1604 »

ElisDN писал(а):В связи getCategories() нужен hasMany().
А по полям:

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

->with([
    'categories' => function ($query) { $query->select('name'); }
]) 
А в случае с hasOne() как быть - не подскажешь? Если применить данный способ то 'categories' возвращает пустую ячейку - хотя в списке запросов запрос есть
Ответить