PenDon
- PenDon 2020-01-13 已签到连续签到1天,获得了5个金钱
- PenDon 2020-01-10 已签到连续签到2天,获得了10个金钱
- PenDon 2020-01-09 已签到连续签到1天,获得了5个金钱
- PenDon 回答了问题 关于 Gii 生成后的 sort 排序
描述的不太清楚,再仔细说一下:通过gii/CRUD生成的products/controller/index方法:
public function actionIndex() { $searchModel = new ProductSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); }
AR类ProductSearch也是通过gii/CRUD生成的:
class ProductSearch extends Product { public function rules() { // ...验证略 } public function scenarios() { return Model::scenarios(); } public function search($params) { $query = Product::find(); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $this->load($params); if (!$this->validate()) { return $dataProvider; } // $query->andFilterWhere([ ... ]); return $dataProvider; } }
在生成的视图页面里点击可排序字段会传一个sort字段到products/index方法,对数据进行排序(url:http://localhost:63341/index.php/admin/shop/products?sort=heat),这个sort字段是如何被处理的呢?
- PenDon 2020-01-06 已签到连续签到1天,获得了5个金钱
- PenDon 2020-01-04 已签到连续签到3天,获得了15个金钱
这个匿名函数 不需要返回值,直接操作
$query
就是了(因为这是 存在性检查,所以肯定有数据库查询)filter => ["field1" => "value1"]
如上代码 等效于
filter => function($query) { $query->andWhere(["field1" => "value1"]); }
所以,对于 and 的查询条件,是不需要用这个 匿名函数的,直接把 过滤条件数组 赋值给 filter 就可以了。当 你想要一个 or 查询的时候,就只能用这个 匿名函数了
filter => function($query) { $query->orWhere(["field1" => "value1"]); }
举一个 有点牵强的 示例场景:
注册的时候,需要填入一个 推荐人用户名,要求 这个推荐人用户名 必须存在,这时 是用不到 filter 属性的。假如用户表是做的 软删除,要求这个推荐人用户名 不能是 已删除的用户,这时 就需要用到 filter 属性了,不过,没必要用匿名函数,直接 给 filter 赋值 就可以了
filter => ["<>", "isDeleted", 1]
。在假如,除了填写 推荐人用户名 还可以填写 推荐人的邮箱(用同一个输入框),这时候就只能用 匿名函数了,考虑一下,这个 该怎么写呢
非常感谢!关于推荐人这个,我个人是这样想的
['recommend', 'exist', 'targetAttribute' => ['recommend' => 'email'], 'filter' => function($query) { $query->orWhere(['username' => $this->recommend]); }],
上面写错了。是
filter => function($query)