Za każdym razem, gdy napotkasz problemy z zapytaniami, sprawdź, jakie zapytania są faktycznie generowane (na przykład używając Zestaw debugowania ). O ile nie jest obiektem wyrażenia, prawa strona warunku będzie zawsze powiązana jako parametr, tj. porównujesz z literałem ciągu:
Pupils.school_id = 'Schools.id'
Generalnie, aby zapewnić odpowiednią zgodność autocytowania, nazwy kolumn powinny być wyrażeniami identyfikacyjnymi. Podczas gdy lewa strona będzie automatycznie obsługiwana prawidłowo, prawa strona będzie wymagała ręcznego.
W konkretnym przypadku możesz łatwo użyć QueryExpression::equalFields()
, który jest dokładnie tym, co chcesz zrobić, porównując pola/kolumny:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Możliwe jest również ręczne tworzenie wyrażeń identyfikatorów, po prostu tworząc ich instancje:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
lub od CakePHP 3.6 poprzez Query::identifier()
metoda:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
I na koniec zawsze możesz również przekazać pojedynczą wartość ciągu, który jest w zasadzie wstawiany do zapytania jako surowy SQL, jednak w takim przypadku identyfikatory nie będą podlegać automatycznemu cytowaniu identyfikatorów:
->where([
'Pupils.school_id = Schools.id'
])
Zobacz także
- Książka kucharska> Dostęp do bazy danych i ORM> Kreator zapytań> Warunki zaawansowane
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expression\IdentifierExpression