maxkh
@maxkh
Web developer

Yii2, activerecord минусы asArray()?

Всем привет!

Не так давно у нас с коллегой завязался спор, о том как лучше работать с ActiveRecord в Yii2, а в частности с методом asArray();.

Мой коллега предложил всегда или чаще всего использовать этот метод при получении данных из MySQL и строить запросы таким образом, что бы получать всегда плоский массив с нужными данными, похожий на этот
array(
   'id'=>1,
   'name'=>'SomeName',
   'subscribers'=>1,
   'likes'=>5,
);

ключи 'subscribers' и 'likes' это leftjoin в другую таблицу

аргументируя это тем, что:
  • потребление памяти
  • получаем простой массив
  • скорость


Аргументы достаточно сильные, а мой контраргумент только удобство разработки с объектами.

На простом примере, когда задача сводиться к получить и отобразить, работа с asArray(); очевидно выглядит намного предпочтительней, ведь действительно, зачем нам данные которые хранит модель ActiveRecord, информация о behavior и прочее.

Небольшой пример работы с данными в представлении для сравнения
// asArray();
foreach($model as $user){
   <p><?= $user['name'] ?><p/>
   <p><?= $user['subscribers'] ?><p/>
   <p><?= $user['likes'] ?><p/>
}
// Object
foreach($model as $user){
   <p><?= $user->name ?><p/>
   <p><?= $user->subscribers->value ?><p/>
   <p><?= $user->likes->value ?><p/>
}


Тест коллеги на локальном образе vagrant показал, что на 1 тыс записей asArray(); требует 4MB памяти, а объекты 12MB.

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

У кого какие мысли на этот счет ? Насколько работа с объектами выигрышна по сравнению с массивами при задаче получить и отобразить ?
  • Вопрос задан
  • 4931 просмотр
Решения вопроса 1
MegaMufa
@MegaMufa
Использовать asArray() означает похерить псе плюшки ООП. Не забывайте, что кроме полей в моднлях еще и логика. У вас даже автокомплит не будер таботать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
На мой взгляд не надо выбирать. Иногда надо использовать массив иногда объект. Все зависит от ситуации. Думаю что удобнее изначально работать с объектами, а потом при оптимизации добавлять asArray где это возможно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы