對於一個只會在使用join
策略hasOne
或belongsTo
associtiation的情況下工作,否則,表將不包括在主查詢。
Query::contain()
和Query::matching()
,因爲它們出現在一個固定的順序卻沒有發揮好在一起,就是matching
加入contain
加入之前,這使得通過Query::matching()
回調不可能使用條件將被放置。您可以使用Query::leftJoinWith()
或Query::innerJoinWith()
來代替方法調用的順序,也可以將條件添加到主查詢中。
您的字段比較是無效的PHP,但即使正確引用不會奏效,您也必須將原始SQL片段作爲單個值傳遞,或者更好地通過表達式構建它,例如使用QueryExpression::equalFields()
方法。
$query = $articles
->find()
->innerJoinWith('Names')
->matching('Comments.Users', function (\Cake\ORM\Query $q) use ($username) {
return $q->where(function (\Cake\Database\Expression\QueryExpression $exp) {
return $exp->equalFields('Users.username', 'Names.username');
});
});
// only works in case `Names` is a `hasOne` or `belongsTo` association
$query = $articles
->find()
->contain('Names')
->matching('Comments.Users')
->where(function (\Cake\Database\Expression\QueryExpression $exp) {
return $exp->equalFields('Users.username', 'Names.username');
});
參見
來源
2017-07-19 14:01:48
ndm