基于上述文章评论的原有代码,这次改用AppServiceProvider
内提前注册DB Query扩展自定义方法的方式;
namespace App\Providers;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->_dbQueryBuilderMacro();
}
private function _dbQueryBuilderMacro()
{
// 注册一个DB Query自定义扩展方法:exceptField
\Illuminate\Database\Query\Builder::macro('exceptField',
function($filed){
$_cacheName = 'db_'.$this->from;
if (Redis::exists($_cacheName)) {
$columns = json_decode(Redis::get($_cacheName),true);
}else{
$columns = Schema::connection($this->connection->getConfig('name'))
->getColumnListing($this->from);
Redis::set($_cacheName,json_encode($columns));
}
$columns = array_diff($columns,$filed);
$columns = array_values($columns);
return $this->select($columns);
});
}
}
使用方法也很简单:
$_mUser = new \App\Models\Users;
dd($_mUser->exceptField(['created_at','updated_at'])->get()->toArray());
这时查询会得到除了指定['created_at','updated_at']
两个字段以外的其余字段查询结果数据;
查看SQL日志时,SQL语句也会变成:
select `name`,`account`,`account_verified_at`,`password`,`remember_token` from `users`
// 少了`created_at`,`updated_at`字段
Ps:
Laravel DB自带的
/**
* The attributes that should be hidden for serialization.
*
* @var array
*/
protected $hidden = [];
可通过setHidden、makeHidden方法来进行SQL查询后的字段隐藏;
也就是说在SQL语句时并不会纳入SELECT
中过滤;