2017-05-18 561 views
0

は、私の知る限りwhereNotExistsを理解し、それが渡されたクロージャ内のすべてのクエリを除外しなければならない作業ではありません。 しかし、予期しない結果が出ています。Laravel whereNotExistsが正しく

私は閉鎖の条件に適用される学生のすべてを返却されませんしようとしています。親が不在または欠席していない学生。私が得ているのは、空の学生配列[]です。

私は間違っていますか?

$students = DB::table('rounds') 
       ->where('rounds.bus_id', '=', $bus_id) 
       ->join('rounds_students', 'rounds_students.round_id', 'rounds.id') 
       ->whereNotExists(function ($query) { 
        $query->select(DB::raw(1)) 
         ->from('student_history') 
         ->where('student_history.student_id', '=', 'rounds_students.student_id') 
         ->where('student_history.activity_type', '=', 'absent') 
         ->orWhere('student_history.activity_type', '=', 'absent-by-parent'); 
        }) 
       ->join('students', 'students.id', 'rounds_students.student_id') 
       ->select('students.name') 
       ->get(); 
      return $students; 
+0

を試してみてください。ここであなたはまったくそれをしていません。 – apokryfos

+0

@apokryfosは、私はすでにそれをしたが、質問にそれを言及するのを忘れ。その質問を更新しました。私はまだ空の$学生配列を持っています。 – WingsOfAltair

答えて

1
  1. あなたはNOT EXISTS句に相関条件を定義するためにwhereRaw()またはwhere(DB::raw('...'))で生の発現を使用する必要があります。それ以外の場合は'rounds_students.student_id'が文字列値として渡されますが、これはあなたが望むものではありません。
  2. あなたWHERE条件にAND sおよびOR秒の気をつけろ!あなたのことは間違っていた。それをより簡潔にするためにwhereInに変更しました。

またselect(DB::RAW(1))EXISTS節に実際に使用する必要はありません。データベースオプティマイザは、外部クエリに結果セットを返す必要がないことを認識しています。これはコードの膨大さを少なくするのに役立ちます。

は通常 `NOT EXISTS`サブクエリは、外部クエリのいくつかの要素を使用しています

$students = DB::table('rounds') 
    ->select('students.name') 
    ->join('rounds_students', 'rounds_students.round_id', 'rounds.id') 
    ->join('students', 'students.id', 'rounds_students.student_id') 
    ->where('rounds.bus_id', $bus_id) 
    ->whereNotExists(function ($query) { 
     $query->from('student_history') 
      ->whereRaw('student_history.student_id = rounds_students.student_id') 
      ->whereIn('student_history.activity_type', ['absent', 'absent-by-parent']); 
    }) 
    ->get(); 
関連する問題