巧用字段映射实现指定字段的搜索

我们在使用搜索的时候,可能会有以下需求:

  • 数据库字段不被暴露出来
  • 搜索的代码尽可能公用化

ok,我们来一起实现吧

  1. Model 里定义一个public变量

    
    public $searchField =[
        'username' => 'name',
        'type'  => 'user_type',
        'game_id' => 'game_type_id',
        'status' => 'user_status',
    ]; //在这里做字段映射
    
    

    这里已经完成了字段映射的相关操作,继续

  2. Repository里注入这个变量

    
    public function __construct(User $user)
    {
        $this->model = $user;
        $this->searchField = $user->searchField;
    }
    
    

    此处之所以单独将映射注入是因为:可能会有非公用查询导致完整的对象实例变成Builder对象而导致无法取到映射字段的情况。

  3. BaseRepositorypaginate方法里增加以下代码

    
        $params = \Request::all();
    
        $fields = isset($this->searchField) ? $this->searchField :[];
    
        if (count($fields) > 0 ){
            foreach ($params as $param => $value ) {
                if (array_has($fields , $param )){
                    $this->model = $this->model->where( array_get( $fields , $param ) , $value);
                }
            }
        }
    
    

在URL里添加你映射的参数,试试看吧~

代码示例:代码片段

最后,希望你们能看的懂我在说什么...(我自己都不知道我在干什么)

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4

你的BaseRepository为啥要用trait定义,感觉直接定义成父级class或者abstract class会好一点好吧 :hamster:

6年前 评论

@tonyski 个人喜好,没有什么好不好的

6年前 评论

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