簡體   English   中英

Laravel 5.2 急切負載關系與匯總計算

[英]Laravel 5.2 eager load relation with summary calculation

我正在開發一個簡單的任務應用程序。 我想急切加載每個項目花費的總時間。 我有兩個表:

Table: task_project 
id, client_id, name, description

Table: task_entries
id, task_project_id, start_time, end_time

表之間的關系通過task_project.id = task_entries.task_project_id建立。

對於表task_project每個項目,我們跟蹤task_project中每個任務的task_entries 我創建了一個名為elapsed的方法來處理這個問題。

所以在我的模型TaskProject我有一個taskselapsed的關系:

public function tasks()
{
    return $this->hasMany(TaskEntry::class, 'task_project_id');
}

public function elapsed()
{
    return $this->hasOne(TaskEntry::class, 'task_project_id')
        ->selectRaw('time_format(SUM(timediff(task_end_time, task_start_time)), "%H:%m:%s") AS hours')
        ->groupBy('task_entries.task_project_id');
}

然后在我的控制器中我這樣稱呼它:

$tasks = TaskProject::with('elapsed')->paginate(15);

但是對於每個項目行, elapsed的關系是一個空值。

我希望最終能夠通過使用以下方式在我的刀片模板中以 hh:mm:ss 的形式訪問此值:

$task->elapsed->hours

任何幫助表示贊賞!

這是一個有趣的方法。 我之前遇到過如何從 Eloquent 獲取聚合列表的問題。 這是我能想到的最好的。

class TaskEntry
{
    public static function addElapsedTo($tasks)
    {
        $ids = $tasks->pluck('id');
        $placeholders = trim(str_repeat('?,', count($ids)), ',');

        $times = DB::select('
            SELECT 
                task_project_id,
                TIME_FORMAT(
                    SUM(TIMEDIFF(task_end_time, task_start_time)),
                    "%H:%m:%s"
                ) AS hours
            FROM task_entries
            WHERE task_project_id IN ('.$placeholders.')
            GROUP BY task_project_id
        ', $ids);

        $times = collect($times)->groupBy('task_project_id');

        foreach ($tasks as $task)
        {
            $task->setAttribute('elapsed', $times[$task->task_project_id]['hours']);
        }
        return $tasks;
    }
}

然后你可以像這樣使用它。

$tasks = TaskProject::paginate(15);
$tasks = TaskEntry::addElapsedTo($tasks);

$task->elapsed包含經過的小時值。

通過這種方式,您可以執行兩個數據庫查詢而不是一個。 但是您仍然避免對每個結果執行查詢。

像這樣的方法對我來說效果很好。 雖然感覺有點雞肋。 我很想找到更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM