Реляцию через грид?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Реляцию через грид?

Сообщение feodor »

Подскажите плз, можно ли как-то вывести реляцию через грид?
Типа того:

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

$this->widget('zii.widgets.grid.CGridView', [
    'dataProvider' => $model->product_item,
    'columns' => [
        'name',
        'price',
    ]
]);
Или лучше отказаться от реляции и сделать запрос?
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Реляцию через грид?

Сообщение chesar »

$model-product_item будет возвращать IDataProvider ?
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Реляцию через грид?

Сообщение SiZE »

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

'columns' => [
    'product_item.name'
]
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Re: Реляцию через грид?

Сообщение feodor »

chesar писал(а): 2017.06.01, 17:59 $model-product_item будет возвращать IDataProvider ?
Возвращает массив моделей ProductItem
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Re: Реляцию через грид?

Сообщение feodor »

SiZE писал(а): 2017.06.01, 18:50

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

'columns' => [
    'product_item.name'
]
Так не получается, выдает
Fatal error: Call to a member function getData() on array in C:\wamp64\www\lib\yii\framework\zii\widgets\CBaseListView.php on line 125

Может можно как-то реляцию к CArrayDataProvider подогнать...
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Реляцию через грид?

Сообщение SiZE »

feodor писал(а): 2017.06.01, 23:59 Так не получается
Магический шар мне подсказывает, что ты решил бездумно подставить мой пример и оставил строку 'dataProvider' => $model->product_item, без изменений
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Re: Реляцию через грид?

Сообщение feodor »

Магический шар мне подсказывает...
Хорошо когда шар есть.
Нашел вот такое:

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

$dataProvider =  new CArrayDataProvider('Product');
$dataProvider->setData($model->product_item);
$this->widget('zii.widgets.grid.CGridView', [
    'dataProvider' => $dataProvider,
        'columns' => [
            'price',
        ],
    ]); ?>
Но при этом появляется новый запрос
SELECT ... FROM `product_item` `product_item` WHERE (`product_item`.`product_id`=...)

Я думал можно как-то без доп запросов.
'dataProvider' => $model// не работает, потому что это не провайдер
'dataProvider' => $model->search()//новый запрос

Или запрос неизбежен?
Не пойму(
Последний раз редактировалось feodor 2017.06.05, 14:16, всего редактировалось 1 раз.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Реляцию через грид?

Сообщение SiZE »

Давай начнем с другого края. Опиши схему бд и поля которые хочешь увидеть в гриде.
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Re: Реляцию через грид?

Сообщение feodor »

SiZE писал(а): 2017.06.05, 15:24 Давай начнем с другого края. Опиши схему бд и поля которые хочешь увидеть в гриде.
Есть product и связанные item через product_item

product
======
-id
-name

product_item
===========
-id
-product_id
-item_id
-price

item
====
-id
-name

В ProductController, во view у меня есть реляция $model->product_item, думаю как бы было здорово кинуть ее в грид и получить список связанных item (name + price).
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Реляцию через грид?

Сообщение SiZE »

Не если ты хочешь именно через реляцию вывести, тогда так

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

class Produect extends CActiveRecord 
{
    public function searchRelated()
    {
        return new CActiveDataProvider(get_class($this), array(
            'criteria' => array(
                'with' => array('product_item')
            ),
        ));
    }
}

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

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->searchRelated(),
    'columns'=>array(
        'product_item.id',
        'product_item.name',
    ),
));
feodor
Сообщения: 95
Зарегистрирован: 2013.01.28, 00:02

Re: Реляцию через грид?

Сообщение feodor »

SiZE писал(а): 2017.06.05, 16:28 именно через реляцию
Спасибо, только вот новый запрос появляется или нет?
Как вообще оптимально вывести таблицу item на странице продукта. Может лишний запрос не к чему?
Я обычно выводил просто через foreach, но с гидом как-то покрасивше.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Реляцию через грид?

Сообщение SiZE »

feodor писал(а): 2017.06.05, 17:23 Как вообще оптимально вывести таблицу item на странице продукта. Может лишний запрос не к чему?
Где цифры? Без цифр это все эмоции.
Ответить