2016-06-07 19 views
1

Ich konvertiere einige Funde von CakePHP2 zu CakePHP3. Ich muss nach einem Vor- und Nachnamen in einer Tutorentabelle suchen, die in verschiedenen Spalten gespeichert sind. Laut den Dokumenten musste ich eine LINKE Verbindung zwischen den Tischen haben. Ich habe eine oder eine Bedingung mit 2 Feldern verwendet, funktioniert aber wie und 'und' bedingt, wenn beide Parameter einen Wert haben. Mein Problem istErzeuge eine OR SQL-Anweisung in CakePHP 3

q1) I cant get the data with just the first name only , and the surname is null. 
    q2) I need to pass both first name and surname to get just those data with that name. 
     Not sure how to do this in cakephp3. 

eg $a5='fred'; //just want all first names like fred 
    $a6=null; //sometimes this will be filled 
    $a3='2015-05-30'; 
    $a4='2016-06-01'; 

$query3 = $this->Lessons->find() 
      ->contain(['Tutors']) 
      ->select(['lessons.id','lessons.lesson_date','tutors.id','tutors.first_name','tutors.last_name' ])  
      ->where(['Lessons.lesson_date >' => $a3,'Lessons.lesson_date <' => $a4, 
'OR' => [['tutors.first_name like' => '%'.$a5.'%'], ['tutors.last_name like' => '%'.$a6.'%']], 

     ]); 

     foreach ($query3 as $row) { 

        debug($row->toArray()); 


      } 

ich in diesem Punkt die Dokumentation verstehen abgepfiffen.

UPDATE- versuchte dies und dies gibt auch nur alle Daten mit entweder 'at' oder 'to', aber es sollte irgendwelche Namen mit sowohl 'at' als auch 'to' in ihnen sein.

$query3 = $this->Lessons->find() 
      ->contain(['Tutors','Subjects', 'TutoringTypes','Terms','Students']) 
       ->select(['lessons.id','lessons.lesson_date','tutors.id','tutors.first_name','tutors.last_name', 
        'subjects.id','subjects.name','terms.id','terms.title'])   
    ->where(['Lessons.lesson_date >' => $a3,'Lessons.lesson_date <' => $a4]) 
    ->orWhere(function ($exp) { 
     return $exp->and_([ 
      'tutors.first_name like' => '%an%', 
      'tutors.last_name like' => '%to%', 
     ]); 
    }); 

Antwort

1

Achten Sie auf das generierte SQL. Sie sehen es entweder in DebugKit oder debuggen es durch Aufruf von $query->sql(). Sie erstellen eine falsche Abfrage:

Sie generieren OR ((... AND ...)), weil Sie eine and_ verwenden. Sie wollen wahrscheinlich ... OR ....

->orWhere(function ($exp) { 
    return $exp->and_([ 
     'tutors.first_name like' => '%an%', 
     'tutors.last_name like' => '%to%', 
    ]); 
}); 

Sie wollen wahrscheinlich OR. Aber das Array direkt an orWhere() übergeben würde auch funktionieren.