2016-04-23 21 views
1

私は単純なタスクアプリを開発中です。私は各プロジェクトに費やされた合計時間を積極的にロードしたいと思う。テーブル間の関係がtask_project.id = task_entries.task_project_idを介して確立されLaravel 5.2熱心な負荷関係と集計計算

Table: task_project 
id, client_id, name, description 

Table: task_entries 
id, task_project_id, start_time, end_time 

:私は2つのテーブルを持っています。

テーブルtask_projectのプロジェクトごとに、各タスクの時間をtask_entriesに記録します。これを処理するためにelapsedというメソッドを作成しました。

は、だから私のモデルTaskProjectに私がtasksためとelapsedのための関係があります。

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ための関係がありますプロジェクト行ごとにnull値。 MM:SSを使用して:

私はHHとして私ブレードテンプレートでこの値にアクセスすることが可能になってしまうしたい

$task->elapsed->hours 

すべてのヘルプは歓迎です!

答えて

1

これは興味深いアプローチです。私は以前に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には経過時間の値が含まれています。

この方法で、1つではなく2つのデータベースクエリを実行します。しかし、すべての結果に対してクエリを実行することは避けられます。

このような方法は私にとってはうまくいきました。それは少しkludgyを感じるが。私はより良い方法を見つけることが大好きです。

+0

ありがとう@programmerKev! – TheRealPapa

関連する問題