ykaej / simple-repository
Laravel Simple Repository
Requires
- php: >=7.0.0
- illuminate/console: ^5.2
- illuminate/database: ^5.2
- illuminate/filesystem: ^5.2
- illuminate/support: ^5.2
README
simple-repository 是一个为laravel5提供的数据库抽象层,目的是为了将应用的数据库操作和核心的业务逻辑分离开,保证controller的精致。
简介
这是一个简易版的 repository 模式
安装
composer require ykaej/simple-repository
如果你是 laravel5.5 以上,你将不需要在 app.php
当中加载以下配置:
'providers' => [
...
Ykaej\Repository\Providers\RepositoryProvider::class,
],
然后运行这个命令来发布配置
php artisan vendor:publish --provider "Ykaej\Repository\Providers\RepositoryProvider"
使用
首先,创建你的repository类,你可以在命令行中使用如下命令自动生成该类
php artisan make:repository Post --model=Post
其中,--model
是可选的,用来指定 repository 中 model 的名称 ,默认情况下,会根据 repository 的名称自动生成 model 名,生成的文件如下:
<?php namespace App\Repositories\Eloquent; use Ykaej\Repository\Eloquent\BaseRepository; use App\Models\Post; class PostRepository extends BaseRepository { public function model() { return Post::class; } }
当然,你也可以手动创建 repository 类,该类必须继承 Ykaej\Repository\Eloquent\BaseRepository
,并实现 model()
方法,
该方法用来指定该repository对应的数据模型。
最后,在你的 controller 中使用 repository
<?php namespace App\Http\Controllers; use App\Repositories\Eloquent\PostRepository; class PostController extends Controller { protected $post; public function __construct(PostRepository $post) { $this->post = $post; } public function index() { $this->post->all(); } }
可用方法
Ykaej\Repository\Contracts\RepositoryInterface
public function all($columns = ['*']); //获取所有记录 public function paginate($limit = null, $columns = ['*']); //分页, 默认可以再 `repository.php` 中调 public function find($id, $columns = ['*']); //按id查找 public function findOrFail($id, $columns = ['*']); //按id查找 public function findByField($field, $value = null, $columns = ['*']); //按指定字段查找 public function findWhere(array $where, $columns = ['*']); //按多个条件查找 public function findWhereIn($field, array $values, $columns = ['*']); public function findWhereNotIn($field, array $values, $columns = ['*']); public function create(array $attributes); //创建一条数据 public function update(array $attributes, $id); //修改一条数据 public function updateBatch(array $multipleData); //批量修改 public function delete($id); //删除 public function forceDelete(); //永久删除 public function deleteWhere(array $where); //按条件删除 public function deleteWhereIn($field, array $values); public function increment(string $name, int $amount = 1); public function decrement(string $name, int $amount = 1); public function has($relation); //数据关联 public function with($relations); //数据关联 public function withCount($relations); //关联数据计数 public function whereHas($relation, $closure); //关联查找 public function orderBy($column, $direction = 'asc'); public function where($field, $condition, $value = null, $boolean = 'and'); public function whereIn($field, array $values);
简单例子
创建一条记录:
$this->post->create(Input::all());
修改记录:
$this->post->update(Input::all(),$id);
批量修改,默认以id为条件更新,如果没有ID则以第一个字段为条件:
$data =[ ['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq.com'], ['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'], ... ]; $this->post->updateBatch($data);
按id查找,可以指定查找字段:
$this->post->find($id,['id','title','body']);
按指定字段查找:
$this->post->findByField('title',$title);
多个条件查找:
$this->post->findWhere([ 'author' => $author_id, ['year','>',$year] ]);
永久删除:
$this->post->whereIn('id',[1,2,3])->forceDelete();
增加某字段数量
$this->post->whereIn('id',[5,6])->increment('count',2);
Criteria
Criteria 是一个让你可以根据具体或者一系列复杂的条件来向你的 repository 发起查询的方式, 你可以将一些可能会重复出现多次的查询条件放到这里,达到复用的目的,将复杂的条件查询从 controller 当中抽离出来。
你的 Criteria 类必须继承
Ykaej\Repository\Criteria\Criteria
创建Criteria
php artisan make:criteria Post
一个简单的例子,简单查 没有隐藏的文章
<?php namespace App\Repositories\Criteria; use Ykaej\Repository\Contracts\RepositoryInterface; use Ykaej\Repository\Criteria\Criteria; class UnHiddenCriteria extends Criteria { public function apply($model, RepositoryInterface $repository) { return $model->where('is_hidden','F'); } }
然后,在你的 controller 里面,你可以调用 repository 的 pushCriteria
方法:
<?php namespace App\Http\Controllers; use App\Repositories\Eloquent\PostRepository; use App\Repositories\Criteria\UnHiddenCriteria; class PostController extends Controller { protected $post; public function __construct(PostRepository $post) { $this->post = $post; } public function index() { $this->post->pushCriteria(new UnHiddenCriteria()); $this->post->all(); } }
你也可以设置在 post 下全局使用的 criteria ,在 PostRepository
下 boot
方法中实现 pushCriteria
方法
`PostRepository` public function boot() { $this->pushCriteria(new UnHiddenCriteria()); }
最后
以上的思路和代码在阅读了很多大神的代码后产生的,尤其是 这个.