模型搜索器

  1. 搜索器是用于封装字段(或搜索标识)的查询表达式;
    2. 一个搜索器对应模型的一个特殊方法,该方法为 public;
    3. 方法名的命名规范为:searchFieldNameAttr();
    4. 举个例子,我们要封装一个邮箱字符模糊查询,然后封装一个时间限定查询;
    5. 在 User 模型端,我创建两个对外的方法,如下:
    1. //Model中
    2. public function searchEmailAttr($query, $value) {
    3. $query->where('email', 'like', $value.'%');
    4. }
    5. public function searchCreateTimeAttr($query, $value) {
    6. $query->whereBetweenTime('create_time', $value[0], $value[1]);
    7. }
  2. 然后,在控制器端,通过 withSearch()静态方法实现模型搜索器的调用;
    1. $result = UserModel::withSearch(['email', 'create_time'],[
    2. 'email' => 'xiao',
    3. 'create_time' => ['2014-1-1', '2017-1-1']
    4. ])->select();
  3. withSearch()中第一个数组参数,限定搜索器的字段,第二个则是表达式值;
    8. 如果想在搜索器查询的基础上再增加查询条件,直接使用链式查询即可;
    1. UserModel::withSearch(...)->where('gender', '女')->select()
  4. 如果你想在搜索器添加一个可以排序的功能,具体如下:
    1. public function searchEmailAttr($query, $value, $data)
    2. {
    3. $query->where('email', 'like', $value.'%');
    4. if (isset($data['sort'])) {
    5. $query->order($data['sort']);
    6. }
    7. }
    8. $result = UserModel::withSearch(['email', 'create_time'],[
    9. 'email' => 'xiao',
    10. 'create_time' => ['2014-1-1', '2017-1-1'],
    11. 'sort' => ['price'=>'desc']
    12. ])->select();
  5. 搜索器的第三个参数$data,可以得到 withSearch()方法第二参数的值;
    11. 字段也可以设置别名:’create_time’=>’ctime’

    模型数据集

  6. 数据集由 all()和 select()方法返回数据集对象;
    2. 数据集对象和数组操作方法一样,循环遍历、删除元素等;
    3. 判断数据集是否为空,我们需要采用 isEmpty()方法;
    1. $resut = UserModel::where('id', 111)->select();
    2. if ($resut->isEmpty()) {
    3. return '没有数据!';
    4. }
  7. 使用模型方法 hidden()可以隐藏某个字段,使用 visible()显示只某个字段;
    5. 使用 append()可以添加某个获取器字段,使用 withAttr()对字段进行函数处理;
    1. $result = UserModel::select();
    2. $result->hidden(['password'])->append(['nothing'])->withAttr('em
    3. ail', function ($value) {
    4. return strtoupper($value);
    5. });
    6. return json($result);
  8. 使用模型方法 filter()对筛选的数据进行过滤;
    1. $result = UserModel::select()->filter(function ($data) {
    2. return $data['price'] > 100;
    3. });
    4. return json($result);
  9. 也可以使用数据集之后链接 where()方法来代替 filter()方法;
    1. $result = UserModel::select()->where('price', '>', '100');
  10. 数据集甚至还可以使用 order()方法进行排序;
    1. $result = UserModel::select()->order('price', 'desc');
  11. 使用 diff()和 intersect()方法可以计算两个数据集的差集和交集;
    1. $result1 = UserModel::where('price', '>', '80')->select();
    2. $result2 = UserModel::where('price', '<', '100')->select();
    3. return json($result1->diff($result2));
    4. return json($result2->intersect($result1));