Yii2-指定一个“;“固定”;条件
我正在构建一个应用程序,其中一个帐户可以有许多服务,所有信息都与一个服务相关。例如: 帐户A有3个服务,每个服务都有页面 为了避免保存页面时有人修改服务id,目前我执行以下操作: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-
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”模型,所有其他与服务相关的模型都应该从中扩展,但不确定如何:
也许有一个简单的解决方案,但由于工作时间长,我的工作过于复杂,不确定。这是适用于所有查询的默认条件。如果您的应用程序构建在类之上(不执行直接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