php - 在 Yii2 中重用查询简写时如何避免字段不明确?

标签 php mysql yii2

我有如下表。

CREATE TABLE A (
    id INT,
    relationId INT,
    status INT
)


CREATE TABLE B (
    id INT,
    status INT
)

类文件如下

class A extends \yii\db\ActiveRecord {
    public function getB() {
        return $this->hasOne(B::class, ['id' => 'relationId']);
    }

    public function find() {
        return new AQuery(__CLASS__);
    }
}

class AQuery extends \yii\db\Query {
    public function isActive() {
        return $this->andWhere(['status' => 1]);
    }
    public function isNotActive() {
        return $this->andWhere(['status' => 0]);
    }
}

class B extends \yii\db\ActiveRecord {
    public function find() {
        return new BQuery(__CLASS__);
    }
}

class BQuery extends \yii\db\Query {
    public function isActive() {
        return $this->andWhere(['status' => 1]);
    }
    public function isNotActive() {
        return $this->andWhere(['status' => 0]);
    }
}

我正在做这样的事情

$model = A::find()
            ->joinWith([
                'b' => function(BQuery $query) {
                     $query->isNotActive();
                }
            ])
            ->isActive()
            ->one();

这会产生错误

Column 'status' in where clause is ambiguous"

我知道的唯一方法是手动向 $query->from 添加别名并重写 $query->andWhere。但是有没有更简单的方法来重用查询简写?

最佳答案

使用ActiveRecord::tableName()而不是别名(这似乎不是 Yii2 中的事件记录功能)。 tableName() 可以通过 modelClass 访问\yii\db\ActiveQuery 的属性。

public function isActive() {
    $modelClass = $this->modelClass;
    return $this->andWhere([$modelClass::tableName().'.status' => 1]);
}

关于php - 在 Yii2 中重用查询简写时如何避免字段不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30839188/

相关文章:

php - RHEL 7.4 未加载 httpd 的 php 扩展并且也无法配置它

php - 将 Symfony 1.4 sfGuardUser 表与 Symfony 2 SecurityBundle 一起使用?

php - 从服务器上的 iPhone 恢复 Facebook Connect session

mysql - 如果行为零,如何运行替代条件

php - 使用 near 的 mysql 正确语法

php - mongoDB 身份验证错误

sql - Mysql:优化在嵌套集合树中查找 super 节点

yii2 - Html::active...() 字段的 AJAX 验证

php - 相关模型中的 yii2 排序

mysql - 添加外键时表迁移问题