2016-06-23 11 views
0

これは説明するのは難しい問題ですが、最善を尽くします。私は今...日付範囲外のタスクを取得するか、日付範囲外のタスクを取得する

を日付範囲内のユーザに割り当てられている(特定のチームから)すべてのタスクをつかむための方法を持っているの下には、(部分的に)必要として は、それが働いている:

  • をauth'dユーザーに割り当てられている
  • 現在のチームからのタスクが

は...

    作業が必要なさい
  • タスクの開始日は、日付範囲内に収まって
  • タスク期日は、日付範囲

内にあるしかし、私はまた、開始日、BEFORE日付範囲AND/ORによる可能性が作業を必要とします日付の後にの期間です。

これは素晴らしいです。しかし、それはまた、他のチームからタスクを取得しています。たとえば、チーム2に切り替えると、というユーザーにが割り当てられているチーム1のタスクも表示されます(表示されない場合)。

私はそれが私のwhere節と関係があると仮定しています。それは複雑な獣です。誰かが助けてくれると願っています。

方法:

$tasks = Team::currentTeam() 
    ->tasks() 
    ->assignedToUser() 
    ->where([ 
     ['status', '!=', 'completed'], 
     ['due_date', '<=', $start_date], 
     ['start_date', '<>', $start_date], 
     ['start_date', '<', $end_date], 
    ]) 
    ->orWhere([ 
     ['due_date', '>', $start_date] 
    ]) 
->get(); 

現在のチームスコープ:ユーザスコープに割り当てられ

public function scopeCurrentTeam($query) 
{ 
    $current_team = Auth::user()->current_team_id; 
    return $query->find($current_team); 
} 

: - 、上の私の思考キャップを置く書い

public function scopeAssignedToUser($query) 
{ 
    return $query->with('user', 'comments')->whereHas('user', function($query) { 
     $query->where('user_id', Auth::user()->id); 
    })->orHas('user', '=', 0); 
} 
+0

我々は 'scopeTasks' – Ohgodwhy

+0

が、それはしますreturn $ this-' ...関係だ見ることができます> hasManyの(タスク::クラス); '' –

+0

assignedToUser'は、hasManyの関係を気にしません。どのようにタスクがユーザーに関連しているかを私に見せてもらえますか? – Ohgodwhy

答えて

0

さて、私はそれを考え出しましたクエリーのすべての可能なシナリオを取り除いて動作させます。私は->where(function()..ので、私のところのクラス(私が前に持っていたような)にwheresの私の膨大なリストをラップする必要がありました

まず、私の関係(tasks())とassignedToUser()スコープと競合しませんでした。

これを行うにはもっとクリーンな方法がありますか?それはf - kinの醜いです...私は誰でもできる "のための"チェックマークを持っています;)私はおそらくどこでそれを私のコントローラから取得するためのスコープを作成するつもりです。

$tasks = Team::currentTeam() 
    ->tasks() 
    ->assignedToUser() 
    ->where(function ($query) use ($start_date, $end_date) { 
     $query->where([ 
      // Task falls on or between date range 
      ['start_date', '>=', $start_date], 
      ['start_date', '<=', $end_date], 
      ['due_date', '>=', $start_date], 
      ['due_date', '<=', $end_date] 
     ])     
     ->orWhere([ 
      // Task is overdue from previous week 
      ['start_date', '<', $start_date], 
      ['due_date', '<', $start_date], 
      ['status', '!=', 'completed'] 
     ])     
     ->orWhere([ 
      // Task start before date range 
      // and due date is past end of date range 
      ['start_date', '<', $start_date], 
      ['due_date', '>', $end_date] 
     ]) 
     ->orWhere([ 
      // Task start within date range, 
      // but due date is past end of date range 
      ['start_date', '>=', $start_date], 
      ['start_date', '<=', $end_date], 
      ['due_date', '>', $end_date] 
     ]) 
     ->orWhere([ 
      // Task due date within date range, 
      // but start date is before start of date range 
      ['due_date', '>=', $start_date], 
      ['due_date', '<=', $end_date], 
      ['start_date', '<', $start_date] 
     ]); 
    })    
->get(); 
関連する問題