Yii2-指定一个“;“固定”;条件

Yii2-指定一个“;“固定”;条件,yii2,yii2-model,yii2-validation,yii2-active-records,Yii2,Yii2 Model,Yii2 Validation,Yii2 Active Records,我正在构建一个应用程序,其中一个帐户可以有许多服务,所有信息都与一个服务相关。例如: 帐户A有3个服务,每个服务都有页面 为了避免保存页面时有人修改服务id,目前我执行以下操作: if(Yii::$app->request->isPost) { $post = Yii::$app->request->post(); $model->load($post); $model->service_id = $this->service-

我正在构建一个应用程序,其中一个帐户可以有许多服务,所有信息都与一个服务相关。例如:

帐户A有3个服务,每个服务都有页面

为了避免保存页面时有人修改服务id,目前我执行以下操作:

if(Yii::$app->request->isPost) {

    $post = Yii::$app->request->post();
    $model->load($post);
    $model->service_id = $this->service->id;
}
其中$model->service\u id=$this->service->id帮助我在将表加载到model之后分配所选的service\u id,并避免有人从表单发送service\u id

但如果将来有人开发“文档”,我希望避免开发人员在所有查询中处理此服务id

所以首先我想我可以试试:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('service_id' => 2);    
    return $queryData;
}
但是仍然需要开发人员来实现它。因此,也许有一种方法可以创建一个“BaseService”模型,所有其他与服务相关的模型都应该从中扩展,但不确定如何:

  • 是否从父模型添加条件
  • 如何将id传递给此模型,使其在所有查询过程中保持不变

  • 也许有一个简单的解决方案,但由于工作时间长,我的工作过于复杂,不确定。

    这是适用于所有查询的默认条件。如果您的应用程序构建在类之上(不执行直接SQL查询或动态查询),那么您只需在模型类中重写
    find()
    方法即可:

    public static function find()
    {
        /* you can add more dynamic logic here */
        return parent::find()->where(['service_id' => 2]);
    }
    
    默认情况下,Yi2中的所有控制器都使用
    Model::find()
    从数据库检索数据,添加这样的条件应该足以不检索任何具有不同于2的
    服务id的内容。如果不满足该条件,则按ID直接http GET请求应输出404,并将其作为关系数据在不同的模型类中检索,应返回一个过滤数组

    重要提示:要不破坏该实现,您需要:

  • 始终使用 . 否则,您需要手动将条件添加到查询中

  • (这是不正确的)请注意何时使用asArray(),因为它忽略了ActiveRecord功能(请参阅)。否则,您需要手动重新声明条件,如:
    Account::find()->where(['service\u id=>2])->asArray()->all()

  • 始终使用andWhere()合并条件,因为where()将覆盖/忽略默认条件。示例:
    Account::find()->andWhere('age>30')->all()


  • 要重用这些过滤器,您可以将它们放入一个文件夹中

    在ActiveRecord中:

    public static function find() {
        return (new ActiveQuery(get_called_class()));
    }
    
    public static function find() {
        return (new ActiveQuery(get_called_class()))->service(2);
    }
    
    ActiveQuery:

    public function service($service = 2) {
        return $this->andWhere(['service_id' => $service]);
    }
    
    基于ActiveRecord的模型:

    public static function find() {
        return (new ActiveQuery(get_called_class()));
    }
    
    public static function find() {
        return (new ActiveQuery(get_called_class()))->service(2);
    }
    
    或者

    $model->find()->service(1);
    

    另外,可能会引起兴趣(为每个场景设置默认值)

    第二点不正确,
    asArray()
    将在
    find()
    中定义的条件下工作,因为它不会影响查询本身。更正。我想我一直在避免使用它,没有任何理由。感谢您指出@rob006