NullRefExcep/yii2-eav

Много запросов в гриде

loveorigami opened this issue · 8 comments

После того, как привязал Eav к модели, независимо от того, вывожу я Eav-аттрибуты в гриде или нет, все равно идут однотипные запросы.

Сейчас у в гриде 4 записи => получаю 5 одинаковых запросов

2018-06-05_12-34-44

проблема в коде привязки поведения (метод behaviors() вашей модели)
попробуйте добавить кэш или мемоизацию

Код, как в доке

public function behaviors()
{
    return [
        /** ... **/
        'eav' => [
            'class' => Entity::class,
            'entity' => function () {
                return new EntityModel([
                    'sets' => [
                        Set::findOne(['code' => 'product']), //product -- set from db
                    ],
                ]);
            },
        ],
    ];
}

У вас должно быть тоже самое. Посмотрите в дебаг панель в гриде, где есть привязка EAV модуля.

Вот про эту анонимку я имел ввиду в предыдущем issue

В документации код для примера, нужно понимать, что метод behaviors вызывается для каждого екземпляра модели.

Сделайте вместо:

Set::findOne(['code' => 'product']),
\nullref\useful\helpers\Memoize::call([Set::class, 'findOne'],[['code' => 'product']]),

А так пропадают eav аттрибуты в гриде.
Я так понимаю, этот запрос дергает для каждого owner-a (строки в гриде) список eav-аттрибутов.
Затем по ним получает ValueModel и далее возвращает join-ы для связи с основной моделью.

в каком метода вы это сделали?

В поведении

            'entity' => function () {
                return new Entity([
                    'sets' => Memoize::call([Set::class, 'findAll'], ['slug' => ['demo']]), // не работает
                    //'sets' => Set::findAll(['slug' => ['demo']]), // работает
                ]);
            },

думаю, проблема в скобках, нужно:

'sets' => Memoize::call([Set::class, 'findAll'], [['slug' => ['demo']]])

Точно! Спасибо!