在 where 条件之前 Where 不工作?

And Where is not working before where condition?

这里我重写了find()方法

class ActiveRecord extends BaseActiveRecord{
    public static function find() {
        return parent::find()
           ->where(['=',static::tableName().'.company_id',Yii::$app->user->identity->company_id])
           ->andWhere(['=',static::tableName().'.branch_id',Yii::$app->user->identity->branch_id]);
    }
}

现在如果我使用这样的条件

\common\models\Order::find()->where(['stastus'=>'3'])->count(); 

Active Record 全局条件在我的条件之前执行 在 Order 模型中使用,然后在 Order 模型中重写 活动记录全局条件。

如果我像这样使用 Active Record 条件

class ActiveRecord extends BaseActiveRecord{
    public static function find() {
        return parent::find()
           ->andWhere(['=',static::tableName().'.company_id',Yii::$app->user->identity->company_id])
           ->andWhere(['=',static::tableName().'.branch_id',Yii::$app->user->identity->branch_id]);
    }
}

在我的本地模型中有一些覆盖了全局条件。困难 我用和在哪里覆盖每个地方。

这就是 Yii2 ActiveRecord 的工作方式。当您调用方法 where() 时,它会重置条件,即使它不为空,当您调用 andWhere() 时,它会为现有条件添加新条件。

您应该将 BaseActiveRecord 中的 whereandWhere 更改为 onCondition,我想这是 \yii\db\ActiveRecord 的别名 作为 ActiveQueryparent::find() return 对象,如果您查看 find() 方法,它 return 位于行

下方

\yii\db\ActiveRecord

 return Yii::createObject(ActiveQuery::className(), [get_called_class()]);

你可以在这里看到customizing-query-class添加一个额外的条件

class ActiveRecord extends BaseActiveRecord{
    return parent::find ()
            ->onCondition ( [ 'and' ,
                [ '=' , static::tableName () . '.application_id' , 1 ] ,
                [ '=' , static::tableName () . '.branch_id' , 2 ]
    ] );
}

现在如果你打电话

\common\models\Order::find()->where(['status'=>'3'])->createCommand()->rawSql; 

它将生成以下查询

SELECT * FROM `order` 
   WHERE (`status` = 3) 
   AND 
   ((`order`.`application_id` = 1) AND (`order`.`branch_id` = 2))