2016-06-20 8 views
0

Ich weiß nicht, wie man Daten mit einem' oder 'conditon über eine hingestomany Tabelle erhält. Ich habe eine Unterrichtsstunde, einen Tutorentisch und einen Schülertisch. Ich übergebe eine Variable für den Vornamen. Zum Beispiel, wenn ich den Namen 'Fred' passiere, dann möchte ich alle Namen der Studenten und Tutoren mit dem Vornamen 'Fred'. Ich habe versucht, eine passende Klausel, aber das reduziert die Daten aus dem primären Modell, so dass nicht korrekt sein kann. Ich benutze ein orwhere, aber das hat nicht funktioniert, weil ich glaube, dass ich das für die sightstomany Beziehung nicht verwenden kann. Wie mache ich das bitteWie verwendet man einen Fund mit einer 'or'-Bedingung für belongsToMany, belongsTo Tabelle

Abfrage einer gefundene Diese Spalte bekam nicht: 1054 Unknown column ‚Students.first_name‘ in ‚where clause‘

///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

Beginnen Sie mit der SQL, die Ihnen die gewünschten Daten gibt. Der Fragetitel scheint sehr wenig mit Ihrem eigentlichen Problem zu tun zu haben. – AD7six

+0

Die 'matching' Abfrage sollte der Weg sein, hier zu gehen, wegen der angleToMany Beziehung. Welches Problem hatten Sie damit? Sie sollten sich 'autoFields' anschauen, um zusätzliche Daten in die Ergebnismenge aufzunehmen. –

+0

Ich habe versucht, die passende Abfrage, aber das reduziert die Zeilen stattdessen .. Ich brauche Zeilen aus beiden Tabellen, wo der Name der gleiche ist. Im ursprünglichen Beitrag ist eine passende Klausel auskommentiert. Wenn es einen anderen Weg gibt, könntest du mir bitte zeigen, wie ich keine Ahnung habe, was ich tun soll. – ajt

Antwort

0

ich die Antwort gefunden, indem die belongstomany Beziehung für Studenten zu entfernen und änderte es in eine Hasmany. Es war eine ziemliche Veränderung, aber diese Beziehung von Angehörigem macht manchmal Kopfschmerzen.

$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);