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

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

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

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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

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

6年前 评论

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

6年前 评论

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