首页 > 解决方案 > Yii2 - 分配一个“修复”条件

问题描述

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

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

为了避免有人在保存页面时修改 service_id,目前我这样做:

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

    $post = Yii::$app->request->post();
    $model->load($post);
    $model->service_id = $this->service->id;
}

其中 $model->service_id = $this->service->id 帮助我在将表加载到模型后分配选定的 service_id 并避免有人从表单中发送 service_id。

但是如果将来有人开发“文档”,我想避免开发人员在所有查询中处理这个 service_id。

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

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('service_id' => 2);    
    return $queryData;
}

但是还是需要开发者来实现。所以也许有一种方法可以创建一个“BaseService”模型,所有其他与服务相关的模型都应该从其中扩展,但不确定如何:

  1. 从父模型添加条件?
  2. 如何将 id 传递给该模型,以便在所有查询期间保留它?

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

标签: yii2yii2-modelyii2-validationyii2-active-records

解决方案


这是适用于所有查询的默认条件。如果您的应用程序构建在ActiveRecord类之上(不执行直接 SQL 查询或动态 QueryBuilder,那么您可以简单地覆盖find()Model 类中的方法:

public static function find()
{
    /* you can add more dynamic logic here */
    return parent::find()->where(['service_id' => 2]);
}

默认情况下,Yii2 中的所有控制器都Model::find()用于从数据库中检索数据,添加这样的条件应该足以不检索与service_id2 不同的任何内容。如果不满足该条件并检索,则按 ID 的直接 http GET 请求应输出 404它们作为不同模型类中的关系数据应返回过滤后的数组。

重要提示:为了不破坏该实施,您需要:

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

  2. (这是不正确的) 何时使用asArray()时要小心,因为它忽略了 ActiveRecord 功能(请参阅此处的注释和说明。否则,您需要手动重新声明条件,例如:Account::find()->where(['service_id' => 2])->asArray()->all();

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


推荐阅读