freevital/laravel-repository

Laravel 5 仓库

1.0.2 2017-04-12 21:44 UTC

This package is not auto-updated.

Last update: 2024-09-29 01:18:25 UTC


README

Latest Stable Version Total Downloads Monthly Downloads License

用于抽象数据库层的 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 许可证下发布。