prettus/laravel-repository

此包已被弃用且不再维护。作者建议使用prettus/l5-repository包。

用于抽象数据库层的存储库

2.0.1 2015-05-26 13:23 UTC

This package is auto-updated.

Last update: 2019-09-03 21:03:18 UTC


README

###此包已被弃用且不再维护。作者建议使用https://github.com/andersao/l5-repository包。

Laravel 4 - 存储库

Build Status Total Downloads Latest Stable Version Latest Unstable Version License

Laravel 4 存储库用于抽象数据层,使我们的应用更容易维护。

参见Laravel 5 - 存储库

安装

在您的composer.json中添加此行:"prettus/laravel-repository": "2.0.*"。

"require": {
    "prettus/laravel-repository": "2.0.*"
}

执行composer update

将此添加到app/config/app.php的服务提供者数组中

    'Prettus\Repository\RepositoryServiceProvider',

发布配置

php artisan config:publish prettus/laravel-repository

方法

存储库

  • scopeReset()
  • find($id, $columns = ['*'])
  • findByField($field, $value, $columns = ['*'])
  • all($columns = array('*'))
  • paginate($limit = null, $columns = ['*'])
  • create(array $attributes)
  • update(array $attributes, $id)
  • delete($id)
  • getModel()
  • with(array $relations);
  • pushCriteria(Criteria $criteria)
  • getCriteria()
  • getByCriteria(Criteria $criteria)
  • skipCriteria()

条件

  • apply($query)

用法

创建模型

正常创建模型,但定义可以从输入表单数据填充的属性很重要。

class Post extends Eloquent { // or Ardent, Or any other Model Class

    protected $fillable = [
        'title',
        'author',
        ...
     ];

     ...
}

创建存储库

use Prettus\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    public function __construct(Post $model)
    {
        parent::__construct($model);
    }   
    
}

使用方法

class PostsController extends BaseController {

    /**
     * @var PostRepository
     */
    protected $repository;

    public function __construct(PostRepository $repository){
        $this->repository = $repository;
    }
    
    ....
}

在存储库中查找所有结果

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

使用分页在存储库中查找所有结果

$posts = $this->repository->paginate($limit = null, $columns = ['*']);

通过ID查找结果

$post = $this->repository->find($id);

在存储库中创建新条目

$post = $this->repository->create( Input::all() );

更新存储库中的条目

$post = $this->repository->update( Input::all(), $id );

在存储库中删除条目

$this->repository->delete($id)

创建条件

条件是一种根据需求应用特定条件来更改查询存储库的方式。您可以在存储库中添加多个条件

class MyCriteria implements \Prettus\Repository\Contracts\Criteria {

    public function apply($query)
    {
        $query = $query->where('user_id','=', Auth::user()->id );
        return $query;
    }
}

在控制器中使用条件


class PostsController extends BaseController {

    /**
     * @var PostRepository
     */
    protected $repository;

    public function __construct(PostRepository $repository){
        $this->repository = $repository;
    }


    public function index()
    {
        $this->repository->pushCriteria(new MyCriteria());
        $posts = $this->repository->all();
		...
    }

}

从条件获取结果

$posts = $this->repository->getByCriteria(new MyCriteria());

在存储库中设置条件的默认值

use Prettus\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    public function __construct(Post $model)
    {
        parent::__construct($model);
    }
    
    public function boot(){
        $this->pushCriteria(new MyCriteria());
        $this->pushCriteria(new AnotherCriteria());
        ...
    }
    
}

跳过存储库中定义的条件

在存储库的任何方法之前使用skipCriteria


$posts = $this->repository->skipCriteria()->all();

使用请求条件

请求条件是标准条件实现。它允许从请求中发送的参数执行存储库中的筛选操作。

您可以执行动态搜索,过滤数据并自定义查询

要在您的存储库中使用条件,您可以在存储库的启动方法中添加一个新条件,或者直接在控制器中使用,以便过滤出少量请求

####在您的存储库中启用

use Prettus\Repository\Eloquent\Repository;
use Prettus\Repository\Criteria\RequestCriteria;

class PostRepository extends Repository {

	/**
     * @var array
     */
    protected $fieldSearchable = [
        'name',
        'email'
    ];

    public function __construct(Post $model)
    {
        parent::__construct($model);
    }
    
    public function boot(){
        $this->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
        ...
    }
    
}

请记住,您需要定义哪些模型字段可搜索。

在您的存储库中将 $fieldSearchable 设置为可搜索的字段。

protected $fieldSearchable = [
	'name',
	'email'
];

您可以设置用于执行查询的条件类型,默认条件是 "="

protected $fieldSearchable = [
	'name'=>'like',
	'email', // Default Condition "="
	'your_field'=>'condition'
];

####在您的控制器中启用

	public function index()
    {
        $this->repository->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
        $posts = $this->repository->all();
		...
    }

条件示例

通过请求不进行过滤请求所有数据

http://prettus.local/users

[
    {
        "id": 1,
        "name": "Anderson Andrade",
        "email": "email@gmail.com",
        "created_at": "-0001-11-30 00:00:00",
        "updated_at": "-0001-11-30 00:00:00"
    },
    {
        "id": 2,
        "name": "Lorem Ipsum",
        "email": "lorem@ipsum.com",
        "created_at": "-0001-11-30 00:00:00",
        "updated_at": "-0001-11-30 00:00:00"
    },
    {
        "id": 3,
        "name": "Laravel",
        "email": "laravel@gmail.com",
        "created_at": "-0001-11-30 00:00:00",
        "updated_at": "-0001-11-30 00:00:00"
    }
]

在存储库中进行研究

http://prettus.local/users?search=Anderson%20Andrade

http://prettus.local/users?search=Anderson&searchFields=name:like

http://prettus.local/users?search=email@gmail.com&searchFields=email:=

[
    {
        "id": 1,
        "name": "Anderson Andrade",
        "email": "email@gmail.com",
        "created_at": "-0001-11-30 00:00:00",
        "updated_at": "-0001-11-30 00:00:00"
    }
]

过滤字段

http://prettus.local/users?filter=id;name

[
    {
        "id": 1,
        "name": "Anderson Andrade"
    },
    {
        "id": 2,
        "name": "Lorem Ipsum"
    },
    {
        "id": 3,
        "name": "Laravel"
    }
]

排序结果

http://prettus.local/users?filter=id;name&orderBy=id&sortedBy=desc

[
    {
        "id": 3,
        "name": "Laravel"
    },
    {
        "id": 2,
        "name": "Lorem Ipsum"
    },
    {
        "id": 1,
        "name": "Anderson Andrade"
    }
]

####重写参数名称

您可以在配置文件 config/repository-criteria.php 中更改参数的名称

作者

Anderson Andrade - contato@andersonandra.de