我有下面这样的桌子。

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"

我知道的唯一方法是手动将alias添加到$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/

10-12 02:22