我们正在使用 LUMEN 开发一个 API。今天我们在收集“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 秒的加载时间,这很好!时间日志表中有大约 20k 个条目。
我的问题是:
- 为什么第一种方法超出范围(什么导致超时?)
- getQuery(); 是什么?究竟是做什么的?
如果您需要更多信息,请询问我。