前端时间翻文档,偶然看见了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();