yii2 - 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”模型,所有其他与服务相关的模型都应该从其中扩展,但不确定如何:
- 从父模型添加条件?
- 如何将 id 传递给该模型,以便在所有查询期间保留它?
也许有一个简单的解决方案,但由于长时间工作,我使自己过于复杂,不确定。
解决方案
这是适用于所有查询的默认条件。如果您的应用程序构建在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_id
2 不同的任何内容。如果不满足该条件并检索,则按 ID 的直接 http GET 请求应输出 404它们作为不同模型类中的关系数据应返回过滤后的数组。
重要提示:为了不破坏该实施,您需要:
始终使用 ActiveRecord。否则,您需要手动将条件添加到查询中。
(这是不正确的)
何时使用asArray()时要小心,因为它忽略了 ActiveRecord 功能(请参阅此处的注释和说明)。否则,您需要手动重新声明条件,例如:Account::find()->where(['service_id' => 2])->asArray()->all();
始终使用andWhere()来合并条件,因为where()将覆盖/忽略默认条件。例子:
Account::find()->andWhere('age>30')->all();
推荐阅读
- webcenter-sites - 更改页面资产定义
- php - Left JOIN 查询不显示数据
- javascript - 如何使用 javascript 将创建的元素存储在 Cookie 或 localStorage 中?
- excel - Excel VBA如何为单独的用户自动保存
- linux - 带错误控制的 shell 并行编程
- angular - Angular 6 - 触发浏览器“保存登录提示”
- mongodb-query - 在 Mongo DB 中,如何获取数据插入的初始日期
- javascript - 如何使用php在每个随机操作数之后生成随机运算符?
- rest - HERE API 根据计算出的路线显示地图
- barcode-scanner - 我的要求是在 power builder 中开发一个应用程序,它接收扫描的条形码并对其进行解码