【ThinkPHP6.x框架】(11)模型3(查询范围、搜索器、数据集)

查询范围

        在模型端创建一个封装的查询或写入方法,方便控制器端等调用。比如,封装一个筛选所有性别为男的查询,并且只显示部分字段5条。方法名规范:前缀scope,后缀随意,调用时直接把后缀作为参数使用:

public function scopeMale($query)
{
    $query->where('gender', '男')
          ->field('id,username,gender,email') 
          ->limit(5);
}

         在控制器端,我们我们直接调用并输出结果即可。

public function scope()
{
    $result = UserModel::scope('male')->select(); 
    //$result = UserModel::male()->select(); 
    return json($result);
}

        查询封装可以传递参数,比如,通过邮箱查找某人:

public function scopeEmail($query, $value)
{
    $query->where('email', 'like', '%'.$value.'%'); 
}

$result = UserModel::scope('email', 'xiao')->select(); 
//$result = UserModel::email('xiao')->select(); 
return json($result);

        也可以实现多个查询封装方法连缀调用,比如找出邮箱xiao并大于80分。

public function scopePrice($query, $value)
{
    $query->where('price', '>', $value); 
}

$result = UserModel::scope('email', 'xiao')
                ->scope('price', 80) 
                ->select();

return json($result);

        注意:

        查询范围只能使用  find()和  select()两种方法;

        全局范围查询,就是在此模型下不管怎么查询都会加上全局条件。

// 定义全局的查询范围
protected $globalScope = ['status']; 

//全局范围
public function scopeStatus($query) {
    $query->where('status',1); 
}

        在定义了全局查询后,如果想取消这个查询的所有全局查询,可以用下面方法。

UserModel::withoutGlobalScope();

        在定义了全局查询后,如果想取消这个查询的部分全局查询,可以添加参数指定。

UserModel::withoutGlobalScope(['status']);

模型搜索器

        搜索器是用于封装字段(或搜索标识)的查询表达式,类似查询范围。一个搜索器对应模型的一个特殊方法,该方法为  public。方法名的命名规范为:searchFieldAttr()。举个例子,我们要封装一个邮箱字符模糊查询,然后封装一个时间限定查询。在User模型端,我创建两个对外的方法,如下:

public function searchEmailAttr($query, $value, $data) {
    $query->where('email', 'like', $value.'%'); 
}

public function searchCreateTimeAttr($query, $value, $data) {
    $query->whereBetweenTime('create_time', $value[0], $value[1]); 
}

        然后,在控制器端,通过  withSearch()方法实现模型搜索器的调用;

$result = UserModel::withSearch(['email', 'create_time'],[
        'email'        => 'xiao',
        'create_time'  => ['2014-1-1', '2017-1-1'] 
])->select();

        withSearch()中第一个数组参数,限定搜索器的字段,第二个则是表达式值。如果想在搜索器查询的基础上再增加查询条件,直接使用链式查询即可。

UserModel::withSearch(...)->where('gender', '女')->select()

        如果你想在搜索器添加一个可以排序的功能,具体如下:

public function searchEmailAttr($query, $value, $data) {
    $query->where('email', 'like', $value.'%'); 
    if (isset($data['sort'])) {
        $query->order($data['sort']); 
    }
}

$result = UserModel::withSearch(['email', 'create_time'],[ 
    'email'        => 'xiao',
    'create_time'  => ['2014-1-1', '2017-1-1'], 
    'sort'         => ['price'=>'desc']
])->select();

        搜索器的第三个参数$data,可以得到  withSearch()方法第二参数的值。字段也可以设置别名:'create_time'=>'ctime'。

模型数据集

        数据集也是直接继承  collection类,所以和数据库方式一样。数据集对象和数组操作方法一样,循环遍历、删除元素等;
        举个简单的例子,判断数据集是否为空,我们需要采用  isEmpty()方法;

$resut = UserModel::where('id', 111)->select(); 
if ($resut->isEmpty()) {
    return '没有数据!'; 
}

        更多数据集方法,直接参考数据库那篇的表格即可。

        使用模型方法hidden()可以隐藏某个字段,使用visible()显示只某个字段。使用append()可以添加某个获取器字段,使用withAttr()对字段进行函数处理。

$result = UserModel::select();
$result->hidden(['password'])->append(['nothing'])->withAttr('email', 
    function ($value) {
    return strtoupper($value); 
    });
return json($result);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值