@akdes

Как оптимизировать скорость свезей бд в laravel?

Всем привет
при концепции дб, была предусмотрена таблица "атрибутов", т.е. некоторые таблицы имеют с ней n:m связь.
К примеру Сustomer с данными, имя, время регистрации, номер счёта и т.д. и т.п., раскиданы на таблицу customer {id, created_at, updated_at}

attributes{name,value}:
name: name, value: Alexander
name: register_time, value: 2018-01-23 12:30:29
name: xy, value: 123...
Насколько это было умно или нет, прошу оставить, система стоит и работает в продакшене.
Сейчас если я подгружаю всех клиентов, имеется проблема загрузки по времени,
в связи с подгрузкой атрибутов. Т.е. помимо подгрузки атрибутов, я их подгружаю в сам объект Customer:
т.е. из Customer { id, attributes {...}} собирается customer {id, name, register_time,...}
Для этого написал функцию в php, насколько я понял, в ларе join'a на этом уровне нет, или?

Как вариант "Quick Win" думал писать имя клиента в Customer-Table, ибо оно мне нужно всегда, остально подгружать по надобности доп. запросом. Есть ли более умное,быстрое и логичное решение?

Спасибо
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
@akdes Автор вопроса
Такс, решение найдено, точнее проблема.

Менее важно в данной проблеме, но факт: join работает быстрее чем жадная загрузка и т.д., не намного но быстрее.
Проблема в другом, если берётся объект из модели, затем мутируется и отдаётся через
return $object; //или 
return response()->json($object);

то именно return длится в моём случае на локалке 20, дополнительных, секунд, т.е. видать т.к. изначальный, знакомый объект "испорчен" доп. данными, при переводе данных в json происходит магия, стоимость n-Секунд.

Решение:
перевод объекта сразу в массив и затем манипуляция.
$myArray = $customer->get()->toArray(); 
$myArray = $this->doStuff($myArray);
return $myArray;

Может быть решение очевидно, я таких граблей не ожидал.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vanillathunder
Зачем придумывать велосипед жадная загрузка

Castomer::with('attributes')->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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