Laravel记录二之辅助函数和几个SQL函数

前端时间翻文档,偶然看见了laravel的一些辅助函数,在代码中运用这些辅助函数回让你代码的简洁度和可读性大大提高:

    1、array_get()、data_get():他们都可以从数组中获取值,区别是data_get()可以从对象中获取值。

        那么就有人会问,我直接从数组中直接获取不就完了吗,非要用这样的函数获取。的确是这样,但是我们在写代码的时候,总有些逻辑判断,比如说一个数组$data,我们不确定其中有我们需要的值,那么这个时候就需要这样判断一下了:   

        

 if( isset($data['user']) && $data['user'] ) {
     //代码
 }

    使用上述辅助函数则不需要写if里面的一大串了
        

if( data_get($data, 'user') ) {
        //代码
}

    是不是看着要简介一些呢,这样还有利于使你的代码clean,

    比如,例如上述的if()代码,完全可以用三元运算替代:

data_get($data, 'user') ?: false;

    还可以这样写(最简模式):

data_get($data, 'user', false);

(关于clean code的问题就不做讨论了,如果有必要觉得精简你的代码,建议阅读https://laravel-china.org/topics/7774/the-conciseness-of-the-php-code-php-clean-code

    类似的还有,比如在某个对象和数组里需要判断有没有某个值 array_has(),和上述的data_get()同样可以使用。具体的还有其他辅助函数,这里就不再一一赘述了,请看官方的文档:https://laravel-china.org/docs/laravel/5.5/helpers

    2、SQL中的when函数、whereHas和whereExists函数:

    1).在web中我们经常有条件查询或者筛选这些功能,这时候就需要用到了when函数了。

    例如,我们需要搜索某个人的姓名,这时候就可以这样写了,就不用再写if()else()。

$username= data_get($search, 'username');
$user = User::when($username, function($query) use($username){
           $query->where('username', $username);
        })->select(['id', 'username'])->first();

 

    这个时候只有当$username参数为true时,闭包里的where语句才会执行。当$username参数为false时,我们可以让when语句执行另一套SQL语句,也就是说,可以给when第三个参数,当给定的参数为false时执行:

$username= data_get($search, 'username');
$user = User::when($username, function($query) use($username){
           $query->where('username', $username);
        }, function($query) use($username){
           $query->where('realname', $username);
        })
        ->select(['id', 'username', 'realname'])->first();

   

    有时候我们经常用join语句来连接查询另一个表中的数据是否存在,但用join会查出这些数据,这时候就可以用whereExists函数来筛选我们想要的数据,例如:

    

$username= data_get($search, 'username');
$$role_id = data_get($search, '$role_id');
$user = User::when($username, function($query) use($username){
           $query->where('username', $username);
        })
        ->whereExists(function ($query) use ($role_id) {
                $query->from('student_courses')->whereRaw("user.id = role.user_id")
                    ->where('role_id', '>', $role_id);
            })
        ->select(['id', 'username'])
        ->first();

    这个时候我们就可以根据条件筛选出是否在role表中的数据。

    2).whereHas和whereExists有异曲同工之妙,都可以拿来判断关联表中是否含有相关数据,但不同的是,whereHas函数需要自定义关联模型。例如,我们在user的models当中先写一个关联模型:

    

    /**
     * 关联角色表
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function roles()
    {
        return $this->hasOne(Roles::class,'user_id', 'id');
    }

    

$username= data_get($search, 'username');
$$role_id = data_get($search, '$role_id');
$user = User::when($username, function($query) use($username){
           $query->where('username', $username);
        })
        ->whereHas('roles', function ($query) use ($role_id) {
                $query->where('role_id', '>', $role_id);
            })
        ->select(['id', 'username'])
        ->first();

 

 

转载于:https://my.oschina.net/Shinsg/blog/1673721

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值