2016-06-20 4 views
0

belongsstomanyテーブルより 'または'条件付きのデータを取得する方法はわかりません。私はレッスンテーブル、チューターテーブル、学生テーブルを持っています。私はファーストネームの変数を渡します。例えば、私が「フレッド」という名前を渡すと、ファーストネーム「フレッド」を持つすべての生徒と教師の名前が必要になります。 私は一致する句を試しましたが、それは正しいことができないようにプライマリモデルからのデータを減らします。私はどこかを使用しますが、私はbelongsstomany関係のためにこれを使用することはできないと思うので、それは動作しませんでした。私はこれがbelongsToMany、belongsToテーブルの 'または'条件でのfindの使い方

クエリが持ってください行うにはどうすればよい見つからないこのコラム:中1054不明な列「Students.first_name」「句」

///lesson model 
    $this->belongsTo('Tutors', [ 
      'foreignKey' => 'tutor_id', 
      'joinType' => 'LEFT' 
     ]); 
$this->belongsToMany('Students', [ 
      'foreignKey' => 'lesson_id', 
      'targetForeignKey' => 'student_id', 
      'joinTable' => 'lessons_students' 
     ]); 


$query3 = $this->find() 
       ->contain(['Tutors','Subjects', 'TutoringTypes','Terms','Students']) 
       ->select(['Lessons.id','Lessons.lesson_date','Tutors.id','Tutors.first_name','Tutors.last_name', 
       // 'Students.id','Students.first_name','Students.last_name', 
        'Subjects.name','TutoringTypes.value'])  
       ->where(['Lessons.lesson_date >' => $a3 , 'Tutors.first_name like' => '%'.$firstname.'%', 
        'Tutors.last_name like' => '%'.$lastname.'%' ]) 
       ->orWhere(['Students.first_name like' => '%'.$firstname.'%' ]) 
       ->order(['Lessons.lesson_date' => 'ASC']) 
       ->hydrate(true); 

    /* 
      $query3->matching('Students', function ($q) use ($firstname,$lastname) { 

       return $q 
        // ->select(['Students.id','Students.first_name','Students.last_name']) 
        ->where(['Students.first_name like' =>'%'.$firstname.'%','Students.last_name like' =>'%'.$lastname.'%', ]); 
       }); 
      */ 
       return $query3; 


    SELECT 
     Lessons.id AS `Lessons__id`, 
     Lessons.lesson_date AS `Lessons__lesson_date`, 
     Tutors.id AS `Tutors__id`, 
     Tutors.first_name AS `Tutors__first_name`, 
     Tutors.last_name AS `Tutors__last_name`, 
     Subjects.name AS `Subjects__name`, 
     TutoringTypes.value AS `TutoringTypes__value` 
    FROM 
     lessons Lessons 
     LEFT JOIN tutors Tutors ON Tutors.id = (Lessons.tutor_id) 
     LEFT JOIN subjects Subjects ON Subjects.id = (Lessons.subject_id) 
     LEFT JOIN tutoring_types TutoringTypes ON TutoringTypes.id = (Lessons.tutoring_type_id) 
     LEFT JOIN terms Terms ON Terms.id = (Lessons.term_id) 
    WHERE 
     (
     Students.first_name like '%fred%' 
     OR (
      Lessons.lesson_date > '2016-01-28' 
      AND Tutors.first_name like '%fred%' 
      AND Tutors.last_name like '%%' 
     ) 
    ) 
    ORDER BY 
     Lessons.lesson_date ASC 
    LIMIT 
     20 OFFSET 0 

    http://book.cakephp.org/3.0/en/orm/query-builder.html 


    //generated query from the below answer 
    SELECT 
     Lessons.id AS `Lessons__id`, 
     Lessons.lesson_date AS `Lessons__lesson_date`, 
     Tutors.id AS `Tutors__id`, 
     Tutors.first_name AS `Tutors__first_name`, 
     Tutors.last_name AS `Tutors__last_name`, 
     Subjects.name AS `Subjects__name`, 
     TutoringTypes.value AS `TutoringTypes__value` 
    FROM 
     lessons Lessons 
     LEFT JOIN tutors Tutors ON Tutors.id = (Lessons.tutor_id) 
     LEFT JOIN subjects Subjects ON Subjects.id = (Lessons.subject_id) 
     LEFT JOIN tutoring_types TutoringTypes ON TutoringTypes.id = (Lessons.tutoring_type_id) 
     LEFT JOIN terms Terms ON Terms.id = (Lessons.term_id) 
    WHERE 
     (
     Lessons.lesson_date > '2016-01-28' 
     AND (
      Students.first_name like '%%' 
      OR Tutors.first_name like '%%' 
      OR Tutors.last_name like '%%' 
     ) 
    ) 
    ORDER BY 
     Lessons.lesson_date ASC 
    LIMIT 
     20 OFFSET 0 
+2

必要なデータを提供するsqlから始めます。質問のタイトルはあなたの実際の問題とはほとんど関係がないようです。 – AD7six

+0

belongsToMany関係のため、 'matching'クエリがここに移動するはずです。あなたはそれでどんな問題を抱えていましたか?結果セットに追加のデータを含めるには、 'autoFields'を見たいかもしれません。 –

+0

私は一致するクエリを試しましたが、代わりに行を減らしました。名前が同じである両方のテーブルから行が必要です。元の投稿には、一致する句がコメントアウトされています。別の方法があれば、私は何をすべきかわからないので私に見せることができます – ajt

答えて

0

私は学生のためのbelongstomany関係を除去することで答えを見つけ、それを何もかもに変えた。それはかなり変化しましたが、この属関係のこの関係は時折頭痛のビットを提供しています。

$query3 = $this->find() 
       ->contain(['Tutors','Subjects', 'TutoringTypes','Terms','Students']) 
       ->select(['Lessons.id','Lessons.lesson_date','Tutors.id','Tutors.first_name','Tutors.last_name', 
        'Students.id','Students.first_name','Students.last_name', 
        'Subjects.name','TutoringTypes.value'])  
       ->where(['Lessons.lesson_date >' => $a3 , 
        'OR' => [[ 'Tutors.first_name like' => '%'.$firstname.'%', 'Tutors.last_name like' => '%'.$lastname.'%'], 
          ['Students.first_name like' => '%'.$firstname.'%', 'Students.last_name like' => '%'.$lastname.'%']] 
       ]) 
       ->order(['Lessons.lesson_date' => 'ASC']) 
       ->hydrate(true); 
関連する問題