巧用字段映射实现指定字段的搜索
- 前言
注:本文假设你使用了 Repository ( BaseRepository)
我们在使用搜索的时候,可能会有以下需求:
- 数据库字段不被暴露出来
- 搜索的代码尽可能公用化
ok,我们来一起实现吧
-
在
Model
里定义一个public
变量public $searchField =[ 'username' => 'name', 'type' => 'user_type', 'game_id' => 'game_type_id', 'status' => 'user_status', ]; //在这里做字段映射
这里已经完成了字段映射的相关操作,继续
-
在
Repository
里注入这个变量public function __construct(User $user) { $this->model = $user; $this->searchField = $user->searchField; }
此处之所以单独将映射注入是因为:可能会有非公用查询导致完整的对象实例变成Builder对象而导致无法取到映射字段的情况。
-
在
BaseRepository
的paginate
方法里增加以下代码$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 协议》,转载必须注明作者和本文链接
看不懂...
你的BaseRepository为啥要用trait定义,感觉直接定义成父级class或者abstract class会好一点好吧 :hamster:
@tonyski 个人喜好,没有什么好不好的
@Rekkles :satisfied: