mysql - CakePHP 3.x - 如何通过另一个关联的字段过滤一个关联?

标签 mysql cakephp associations cakephp-3.0 contain

当 - 就像手册中一样 - 人们可以过滤给定的变量时。

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

如何从另一个包含值中过滤一个值? 我认为下面的例子是可能的。但事实并非如此。

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

最佳答案

对于仅在使用 join 策略的 hasOnebelongsTo 关联情况下才起作用的表,否则该表将不会包含在主查询中。

然而

Query::contain()Query::matching() 不能很好地协同工作,因为它们以固定的顺序出现,即 matching 连接将放置在 contain 连接之前,这使得通过 Query::matching() 回调使用条件变得不可能。您可以使用 Query::leftJoinWith()Query::innerJoinWith() 来代替(它尊重方法调用的顺序),或者将条件添加到 main查询。

您的字段比较是无效的 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');
    });

另请参阅

关于mysql - CakePHP 3.x - 如何通过另一个关联的字段过滤一个关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45189506/

相关文章:

php - 无法将项目升级到CakePHP-2.0

java - 理解代码中的 UML 关联

ruby-on-rails-3 - Rails 3 和 has_many :through: automagically set/initialize attributes on join model

mysql - 我在 WordPress Mysql 的 MySQL 查询中哪里出错了?

mysql - 具有比较日期的嵌套子查询

php - 如何获取按列名索引的数组?

php - CakePHP Force SSL - env ('HTTPS' ) 始终为 null

elasticsearch - Cakephp 4.0.1 ElasticSearch插件问题

ruby-on-rails - rails : form to build deep associations

php - Symfony2 将 4 表内连接查询映射到 Doctrine QueryBuilder