Как правильно вызывать связь из индекса?

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

Как правильно вызывать связь из индекса?

Сообщение alexa777 »

В actionIndex по умолчанию не объявляется модель
В Постах есть связь категорий

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

 public function getCategory()
    {
        return $this->hasOne(Category::className(), ['id' => 'category_id']);
    }
Если во вьюшке индекс вызывать связь

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

$model->category;
Выдает ошибку.
Если в actionIndex объявить

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

$model = new Post();
То все работает, это правильно или есть другой способ как вызвать эту связь?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как правильно вызывать связь из индекса?

Сообщение Alexum »

Если вы создаёте новую модель Post и передаёте во view, то $model->category будет всегда null возвращать. В чём смысл то?
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как правильно вызывать связь из индекса?

Сообщение alexa777 »

Alexum писал(а): 2018.12.29, 12:32 Если вы создаёте новую модель Post и передаёте во view, то $model->category будет всегда null возвращать. В чём смысл то?
Скажите как правильно, вызвать эту связь?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как правильно вызывать связь из индекса?

Сообщение Alexum »

alexa777 писал(а): 2018.12.29, 12:36 Скажите как правильно, вызвать эту связь?
Пока сложно понять, чего вы хотите добиться. Опишите что должно отображаться во view и прикрепите код actionIndex из контроллера.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как правильно вызывать связь из индекса?

Сообщение alexa777 »

Alexum писал(а): 2018.12.29, 12:41
alexa777 писал(а): 2018.12.29, 12:36 Скажите как правильно, вызвать эту связь?
Пока сложно понять, чего вы хотите добиться. Опишите что должно отображаться во view и прикрепите код actionIndex из контроллера.
В модели Post есть связь

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

public function getCategory()
    {
        return $this->hasOne(Category::className(), ['id' => 'category_id']);
    }
в post/index я хочу вывести категории через эту связь

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

    public function actionIndex()
    {
        $searchModel = new Postsearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как правильно вызывать связь из индекса?

Сообщение Alexum »

Вы передаёте во view поисковую модель и DataProvider. И выводите скорее всего внутри виджетов. Так вот внутри виджета можно указать в качестве атрибута название связи и через точку нужный атрибут из связанной модели.

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

...
[
 	'attribute' => category.name,
 	'label' => 'Хочу свой заголовок',
]
...
или внутри параметра 'value':

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

[
    'label' => 'Захотелось вывести название категории',
    'value' => function($model){
      if(!empty($model->category->name)){
           return $model->category->name;
      }
      return null;
     },
]
Во втором случае в функцию на вход будет отправлен экземпляр объекта Post, который получен через DataProvider.

Итог: самому никаких $model создавать в контроллере и тем более во view не нужно.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как правильно вызывать связь из индекса?

Сообщение alexa777 »

Alexum писал(а): 2018.12.29, 14:38 Вы передаёте во view поисковую модель и DataProvider. И выводите скорее всего внутри виджетов. Так вот внутри виджета можно указать в качестве атрибута название связи и через точку нужный атрибут из связанной модели.

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

...
[
 	'attribute' => category.name,
 	'label' => 'Хочу свой заголовок',
]
...
или внутри параметра 'value':

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

[
    'label' => 'Захотелось вывести название категории',
    'value' => function($model){
      if(!empty($model->category->name)){
           return $model->category->name;
      }
      return null;
     },
]
Во втором случае в функцию на вход будет отправлен экземпляр объекта Post, который получен через DataProvider.

Итог: самому никаких $model создавать в контроллере и тем более во view не нужно.

А если без виджета выводить?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как правильно вызывать связь из индекса?

Сообщение Alexum »

alexa777 писал(а): 2018.12.29, 15:33 А если без виджета выводить?
Т.е. у вас будут свои кастумные фильтры, своё переключение пагинации у провайдера и т.п.? Просто если вам нужно отрендерить статичную табличку или нечто подобное, то непонятно зачем использовать поисковую модель и провайдер. В модели Post можно добавить метод для получения записей вместе с категорией в виде обычного массива (Post::findAll()->with('category')->asArray()->all()). В контроллере вызывать данный метод и передавать этот массив во view. Просто лишний раз тягать массивы с тяжёлыми объектами ActiveRecord, да без пагинации и всё только ради отображения - ну такое себе...
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как правильно вызывать связь из индекса?

Сообщение alexa777 »

Alexum писал(а): 2018.12.29, 18:42
alexa777 писал(а): 2018.12.29, 15:33 А если без виджета выводить?
Т.е. у вас будут свои кастумные фильтры, своё переключение пагинации у провайдера и т.п.? Просто если вам нужно отрендерить статичную табличку или нечто подобное, то непонятно зачем использовать поисковую модель и провайдер. В модели Post можно добавить метод для получения записей вместе с категорией в виде обычного массива (Post::findAll()->with('category')->asArray()->all()). В контроллере вызывать данный метод и передавать этот массив во view. Просто лишний раз тягать массивы с тяжёлыми объектами ActiveRecord, да без пагинации и всё только ради отображения - ну такое себе...
Ок спасибо
Ответить