2017-07-19 49 views
0

マニュアルのように、与えられた変数をフィルタリングすることができます。CakePHP 3.x - 別の関連付けのフィールドで1つの関連付けをフィルタリングする方法は?

$username = 'markstory'; 
$query = $articles->find()->matching('Comments.Users', function ($q) use ($username) { 
    return $q->where(['username' => $username]); 
}); 

別の値を含む値をフィルタリングする方法はありますか? 私は以下の例が可能であると考えました。しかし、そうではありません。唯一さもなければテーブルがメインクエリに含まれない、join戦略を使用してhasOne又はbelongsTo associtiationの場合に動作します1について

​​

答えて

0

。彼らは一定の順序で表示されますので、

Query::contain()Query::matching()しかし、一緒にうまく再生されない、それはmatchingcontainが不可能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'); 
    }); 

も参照してください

関連する問題