Laravel — сбор отношений занимает много времениPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Laravel — сбор отношений занимает много времени

Сообщение Anonymous »

Мы разрабатываем API с LUMEN.
Сегодня у нас возникла запутанная проблема с получением коллекции нашей модели «TimeLog».
Мы просто хотели получить все журналы времени с дополнительной информацией из модель доски и модель задачи.
В одной строке журнала времени у нас были Board_id и Task_id. В обоих случаях соотношение 1:1.

Это был наш первый код для получения всех данных. Это занимало много времени, и иногда у нас возникал таймаут:
BillingController.php

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

public function byYear() {

$timeLog = TimeLog::get();

$resp = array();

foreach($timeLog->toArray() as $key => $value) {

if(($timeLog[$key]->board_id && $timeLog[$key]->task_id) > 0 ) {

array_push($resp, array(
'board_title' => isset($timeLog[$key]->board->title) ? $timeLog[$key]->board->title : null,
'task_title' => isset($timeLog[$key]->task->title) ? $timeLog[$key]->task->title : null,
'id' => $timeLog[$key]->id
));
}
}

return response()->json($resp);
}
Файл TimeLog.php, в котором создана связь.

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

public function board()
{
return $this->belongsTo('App\Board', 'board_id',  'id');
}

public function task()
{
return $this->belongsTo('App\Task', 'task_id',  'id');
}
Наш новый способ выглядит следующим образом:
BillingController.php

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

 public function byYear() {

$timeLog = TimeLog::
join('oc_boards', 'oc_boards.id', '=', 'oc_time_logs.board_id')
->join('oc_tasks', 'oc_tasks.id', '=', 'oc_time_logs.task_id')
->join('oc_users', 'oc_users.id', '=', 'oc_time_logs.user_id')
->select('oc_boards.title AS board_title', 'oc_tasks.title AS task_title','oc_time_logs.id','oc_time_logs.time_used_sec','oc_users.id AS user_id')
->getQuery()
->get();

return response()->json($timeLog);
}
Мы удалили это отношение в TimeLog.php, потому что оно нам больше не нужно. Теперь у нас время загрузки около 1 секунды, и это нормально!
В таблице журнала времени около 20 тыс. записей.

Мои вопросы: :
  • Почему первый метод выходит за пределы диапазона (что вызывает тайм-аут?)
  • Что такое getQuery(); точно?
Если вам нужна дополнительная информация, просто спросите меня.

Подробнее здесь: https://stackoverflow.com/questions/453 ... ot-of-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»