字段排除功能

背景:使用过 THINKPHPPHPer 都知道有字段排除功能,个人觉得有时候还是比较好用的,所以分享一下!第一次分享,如有不好之处,请大神指教

这里面主要是使用到 laravel 里面的 Macros
1、在 app\Providers 里面新建一个 QueryMacroServiceProvider 的类

温馨提示:这里面有一个小坑,
\Illuminate\Database\Query\Builder 适合用于DB,Illuminate\Database\Eloquent\Builder 适合用于ORM

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\ServiceProvider;
class QueryMacroServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Builder::macro('selectNotField', function ($columns = ['*']) {

            $columns = is_array($columns) ? $columns : func_get_args();

            $filed = array_diff($this->model->getFillable(), $columns);

            return $this->select($filed);
        });
    }
}

2、 config 里面的 app.php 文件,在providers 进行注册

   'providers' => [
           ......
           App\Providers\QueryMacroServiceProvider::class,

3、使用selectNotFiled查询

$result = self::selectNotField('status','name')->get();
本作品采用《CC 协议》,转载必须注明作者和本文链接
萧风
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 14

到底是排序还是排除呢 :joy:

4年前 评论
sunrise丶 4年前
萧风 (楼主) 4年前

真需要 ('status,name') 类似这样的效果,自己封装一个函数,将字符串转成数组就好了,
->select(str_to_array('status,name'))->

4年前 评论
萧风 (楼主) 4年前
她和她的猫 4年前
萧风 (楼主) 4年前
22 (作者) 4年前
4年前 评论
萧风 (楼主) 4年前

Non-static method Illuminate\Database\Eloquent\Builder::macro() should not be called statically, assuming $this from incompatible context 我的这个说不能调用这个方法这个是什么问题?

4年前 评论

我的是5.3版本的是版本的问题吗?

4年前 评论
萧风 (楼主) 4年前

如果未设置 fillable , 是否会获取不到字段呢 ?

$this->model->getFillable()

改进了一下

<?php
namespace App\Providers;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class QueryMacroServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Builder::macro('selectNotField', function ($columns = ['*']) {

            $columns = is_array($columns) ? $columns : func_get_args();

            $filed = array_diff(Schema::getColumnListing($this->model->getTable()), $columns);

            return $this->select($filed);
        });
    }
}
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!