2016-02-11 6 views
9

存在しません。私は関係ReportUploadstatusのsのプロパティがReportUpload関係はdoesnの0 またはに等しい」すべてReportモデルを取得したいと思い存在しない。 ReportReportUploadモデルは1対1の関係を持ち、ReportUploadReportに属します。が雄弁:関係プロパティが0または関係である熱心な負荷の関係を制約することは

雄弁の関係の制約や他の方法を使って、これについてどうやって行くのかはっきりしません。どんな助けもありがとう。

ここに私の現在のコードです:

// initial query 

$reports = Report::whereHas('link', function($query) { 
     $query->where('status', 'complete'); 
    })->with('student', 'course', 'institution', 'reportUpload'); 


// apply constraint 

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->has('uploadStatus'); // 0 or 1 

    if ($uploadStatus === 0) { 
     $reports = $reports 
      ->whereDoesntHave('reportUpload') 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      }); 
    } else { 
     $reports = $reports->whereHas('reportUpload', function($query) use ($uploadStatus) { 
      $query->where('status', $uploadStatus); 
     }); 
    } 
} 

コードは、望ましい結果が得られていませんが。

編集

このアプローチをしようが、それが正しいかどうかわからない:クエリを分離する

$reports = $reports 
    ->where(function ($query) use ($uploadStatus) { 
     $query 
      ->whereDoesntHave('reportUpload') 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      }); 
    }); 
+0

[WhereDoesnHave](https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html#method_whereDoesntHave)が役立つ可能性がありますか? –

+0

私はそれを使用することをお勧めですか?それはすでに質問の中で私のコードに入っているからです。あなたが何か他のことを意味したら、明確にしてください、ありがとうございます。 – haakym

+0

すみません、@haakym、私は質問を誤解しました、私は私の前のコメントは関係がないと思う。ごめんなさい! –

答えて

6

まず、あなたの最初のコードでは、いくつかのミスがあります。

1 - ご希望の場合は、hasのuploadStatusを確認しています。そして、$uploadStatus == $request->hasは常にtrueになります。

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->has('uploadStatus'); 

だから私は、あなたが望むかもしれない推測:

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->input('uploadStatus'); 

2 - あなたは、要求が文字列'0'ではなく整数を返すことがありますので、あなたはどちらかのはずなので動作しない可能性があります厳密に$uploadStatus === 0を比較しています==と比較するか、$uploadStatusから(int)をキャストしてください。この後

、私は予想通り、あなたの質問に追加されたコードがうまくいくと思う:

$reports = $reports 
->where(function ($query) use ($uploadStatus) { 
    $query 
     ->whereDoesntHave('reportUpload') 
     ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
      $query->where('status', $uploadStatus); 
     }); 
}); 

ためwhere括弧の間にそれを置くクエリをカプセル化します。

+0

あなたの答えをありがとう。私はそれらの間違いが訂正にショットをつけてあなたに戻ってくるのを忘れてしまったとは信じられません。 – haakym

+0

私が欲しいのと同じように動作します!あなたの助けと@ jarek-tkaczykのヒントに関するヒントについては、多くのおかげです。 – haakym

1

てみてください。 whereDoesntHaveは、それがorの文であっても、orWhereHasでマイナスカウントされることがあります。

$reportsNoUpload = $reports 
      ->whereDoesntHave('reportUpload')->get(); 

$reportsIncomplete = $reports 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      })->get(); 

$reports = $reportsNoUpload->merge($reportsIncomplete); 
+0

この問題私が 'laravel datatables 'パッケージを使ってページされている巨大なデータセットを持っているので、' get() 'を実行したくありません。 – haakym