PenDon

PenDon

2019-2020

  • 财富值540
  • 威望值10
  • 总积分860

个人信息

  • 2020-01-13 已签到
    连续签到1天,获得了5个金钱
  • 2020-01-10 已签到
    连续签到2天,获得了10个金钱
  • 2020-01-09 已签到
    连续签到1天,获得了5个金钱
  • 回复了 的回答

    ActiveDataProvider的功劳

    在实例化ActiveDataProvider的时候,并没有设定sort呀,dataProvider是在哪里接收到这个sort的呢?

    $dataProvider = new ActiveDataProvider([
                'query' => $query,
               //  这里设置'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字段是如何被处理的呢?

  • 提出了问题
    关于 Gii 生成后的 sort 排序
  • 2020-01-06 已签到
    连续签到1天,获得了5个金钱
  • 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)

主管 等级规则
860/1000
资料完整度
60/100
用户活跃度
0/100

Ta的关注

2

Ta的粉丝

0

Ta的访客

2