java criteria exist_laravel l5-repository使用Criteria实现复杂查询

laravel扩展:l5-repository,基于的github项目是:l5-repository

在前面文章中笔者也有对l5-repository进行了一系列的介绍和解析,大家有时间可以看看

在repository中,对于CRUD来说,其最难的是R操作,因为会有各种各样的查询方式,提供的查询接口有:

public function find($id, $columns = ['*']);

public function findByField($field, $value, $columns = ['*']);

public function findWhere(array $where, $columns = ['*']);

public function findWhereIn($field, array $values, $columns = ['*']);

public function findWhereNotIn($field, array $values, $columns = ['*']);

然后默认的实现是Prettus\Repository\Eloquent\BaseRepository,基本上就是对Eloquent\Builder的一个封装。

但是一些更复杂的查询怎么满足呢?我们难道需要每次有新的查询都去新增findCondition接口吗?显然我们不能这么做,这个时候Criteria就隆重登场了,先看个接口:

interface CriteriaInterface

{

/**

* Apply criteria in query repository

*

* @param $model

* @param RepositoryInterface $repository

*

* @return mixed

*/

public function apply($model, RepositoryInterface $repository);

}

所有的Criteria都需要实现apply方法,看一个可能是实现:

class LengthOverTwoHours implements CriteriaInterface {

public function apply($model, Repository $repository)

{

$query = $model->where('length', '>', 120);

return $query;

}

}

通过定义LengthOverTwoHours来对Model新增查询,这样子我们每次有新的查询条件,只要新建Criteria即可,满足了开放封闭原则。

接着我们来使用下l5-repository。首先通过命令php artisan make:entity Book来生成文件,然后在AppServiceProvider@register中新增

$this->app->register( RepositoryServiceProvider::class);

接着产生一个Controller

php artisan make:controller -r BookController

在里面我们可以使用注入进Repository

public function __construct( BookRepository $bookRepository )

{

$this->bookRepository = $bookRepository;

}

然后一些具体的操作可以去看https://github.com/andersao/l5-repository,写的非常详细。

最后介绍下怎么产生criteria,通过下面的命令

php artisan make:criteria MyCriteria

然后添加下面代码

class MyCriteria implements CriteriaInterface

{

/**

* Apply criteria in query repository

*

* @param Builder $model

* @param RepositoryInterface $repository

*

* @return mixed

*/

public function apply($model, RepositoryInterface $repository)

{

$model = $model->where('user_id','=', \Auth::user()->id );

return $model;

}

就能够使用了,然后在controller中,我们通过下面的方式查询

public function index()

{

$this->repository->pushCriteria(new MyCriteria());

$books = $this->repository->all();

...

}

总结

以上就是repository的全部,文章开头由实际项目中model越来越胖引出如何给model瘦身,接着对model中的功能进行了划分,给出了合理的项目组织方式,接着通过从repository,presenter,validator分析了具体的一些优化方式。

最后本文只是简单的对l5-repository进行了介绍,更详细的功能,更多的实现细节,你都可以clone项目下来,自己好好去看,相信会学到很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值