freevital / laravel-repository
Laravel 5 仓库
1.0.2
2017-04-12 21:44 UTC
Requires
- illuminate/console: ~5.0
- illuminate/container: ~5.0
- illuminate/database: ~5.0
- illuminate/support: ~5.0
This package is not auto-updated.
Last update: 2024-09-29 01:18:25 UTC
README
用于抽象数据库层的 Laravel 仓库。
安装
运行以下命令安装最新版本
composer require "freevital/laravel-repository"
用法
创建仓库
您的仓库类必须扩展 Freevital\Repository\Eloquent\BaseRepository 抽象类,并实现返回模型类名的 model() 方法。
namespace App\Repositories\Eloquent; use Freevital\Repository\Eloquent\BaseRepository; class PostRepository extends BaseRepository { /** * Specify Model class name. * * @return string */ public function model() { return "App\Post"; } }
在控制器中使用仓库
namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Repositories\Criteria\BySlugCriteria; use App\Repositories\Criteria\WithCommentsCriteria; use App\Repositories\Eloquent\PostRepository; class PostController extends Controller { /** * @var PostRepository */ protected $postRepository; /** * @param PostRepository $postRepository */ public function __construct(PostRepository $postRepository) { $this->postRepository = $postRepository; } /** * Get all posts. * * @return \Illuminate\Http\JsonResponse */ public function index() { $posts = $this->postRepository->all(); return \Response::json(compact('posts')); } }
创建仓库条件
您可以创建一个单独的条件类来应用特定的查询条件。您的条件类必须实现 Freevital\Repository\Contracts\CriteriaContract 接口。
namespace App\Repositories\Criteria; use Illuminate\Database\Eloquent\Builder; use Freevital\Repository\Contracts\CriteriaContract; use Freevital\Repository\Contracts\RepositoryContract; class BySlugCriteria implements CriteriaContract { /** * @var string */ protected $slug; /** * @param string $slug */ public function __construct($slug) { $this->slug = $slug; } /** * Apply criteria in query repository. * * @param Builder $query * @param RepositoryContract $repository * * @return \Illuminate\Database\Eloquent\Builder */ public function apply(Builder $query, RepositoryContract $repository) { return $query->where('slug', $this->slug); } }
在控制器中使用仓库条件
您可以在仓库中使用多个条件。
namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Repositories\Criteria\BySlugCriteria; use App\Repositories\Criteria\WithCommentsCriteria; use App\Repositories\Eloquent\PostRepository; class PostController extends Controller { /** * Get a post by slug. * * @param string $slug * * @return \Illuminate\Http\JsonResponse */ public function show($slug) { $post = $this->postRepository ->pushCriteria(new WithCommentsCriteria()) ->pushCriteria(new BySlugCriteria($slug)) ->first(); return \Response::json(compact('post')); } }
条件宏
如果您想通过自定义通用作用域(例如 ActiveCriteria)扩展仓库功能,您可以使用 BaseRepository 的宏方法。例如,从一个服务提供者的 boot 方法中
namespace App\Providers; use Freevital\Repository\Criteria\ActiveCriteria; use Freevital\Repository\Eloquent\BaseRepository; use Illuminate\Support\ServiceProvider; class RepositoryMacroServiceProvider extends ServiceProvider { /** * Register the application's repository macros. * * @return void */ public function boot() { BaseRepository::macro('active', function (BaseRepository $repository) { $repository->pushCriteria(new ActiveCriteria()); }); } }
宏函数接受一个名称作为其第一个参数,一个闭包作为其第二个。当从任何仓库实例调用宏名称时,将执行宏的闭包
$this->postRepository->active()->all();
可用方法
Freevital\Repository\Contracts\RepositoryContract
paginate($limit = null, $columns = ['*'], $method = 'paginate') simplePaginate($limit = null, $columns = ['*']) all($columns = ['*']) lists($column, $key = null) find($id, $columns = ['*']) first($columns = ['*']) findByAttribute($attribute, $value, $columns = ['*']) findWhere(array $where, $columns = ['*']) findWhereIn($attribute, array $values, $columns = ['*']) findWhereNotIn($attribute, array $values, $columns = ['*']) count() create(array $attributes) update(array $attributes, $id) updateOrCreate(array $attributes, array $values = []) updateActiveStatus($status, int $id) delete($id) forceDelete($id) deleteWhere(array $where) forceDeleteWhere(array $where) has($relation) with($relations) whereHas($relation, $closure) orderBy($column, $direction = 'asc') visible(array $attributes) hidden(array $attributes) scopeQuery(\Closure $scope) resetScope()
Freevital\Repository\Contracts\RepositoryCriteriaContract
pushCriteria($criteria) popCriteria($criteria) getCriteria() getByCriteria(CriteriaContract $criteria) skipCriteria($status = true) resetCriteria()
Freevital\Repository\Contracts\CriteriaContract
apply(Builder $query, RepositoryContract $repository)
示例用法
获取所有实体
$this->postRepository->all(); // Fetch the specific columns $this->postRepository->all(['id', 'title']);
实体分页
$this->postRepository->paginate(20);
通过 id 获取实体
$this->postRepository->find($id);
获取第一个实体
$this->postRepository->pushCriteria(...)->first();
获取实体数量
$this->postRepository->pushCriteria(...)->count();
创建新实体
$this->postRepository->create(Input::all());
通过 id 更新实体
$this->postRepository->update(Input::all(), $id);
通过 id 删除或强制删除实体
$this->postRepository->delete($id); $this->postRepository->forceDelete($id);
致谢
此包主要基于 @andersao 的包。
许可
此仓库的内容在 MIT 许可证下发布。