adamkhoa03/eloquent-repository

v1.0 2021-08-23 15:51 UTC

This package is auto-updated.

Last update: 2024-09-23 23:26:10 UTC


README

为Laravel创建的Eloquent Repository包,完全考虑了“仓库模式”。

要求

版本要求和与Laravel的兼容性

版本 ^1.0 - 仅支持Laravel 8。

安装

您可以通过composer安装此包

composer require adamkhoa03/eloquent-repository

使用方法

创建一个仓库类并扩展Adamkhoa03\EloquentRepository\EloquentRepository抽象类。

扩展EloquentRepository的仓库类必须实现entity方法。当使用Eloquent模型时,只需从方法中返回模型的全命名空间即可。

namespace App\Repositories;

use App\User;
use Adamkhoa03\EloquentRepository\EloquentRepository;

class UserRepository extends EloquentRepository
{
    protected $entity = User::class;
}

该包还附带了一个控制台命令,可以创建仓库类。传递仓库类名到make:repository命令以生成它。

php artisan make:repository UserRepository

这将在您的应用自动加载目录中的Repositories文件夹内创建仓库类。

您还可以将Eloquent模型命名空间传递到make:repository命令中,以自动将该模型应用到仓库中。

php artisan make:repository UserRepository --model=User

这将创建UserRepository类,并将User模型作为实体应用到它。

您可以使用Laravel的容器注入UserRepository仓库。

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class HomeController extends Controller
{
    public function index(UserRepository $userRepository)
    {
        return $userRepository->get();
    }
}

您还可以完全不创建专门的仓库类,而是注入Adamkhoa03\EloquentRepository\EloquentRepository并动态设置Eloquent模型实体。

namespace App\Http\Controllers;

use App\User;
use Adamkhoa03\EloquentRepository\EloquentRepository;

class HomeController extends Controller
{
    public function index(EloquentRepository $repository)
    {
        return $repository->setEntity(User::class)->get();
    }
}

可用方法

Eloquent Repository类提供了一系列Eloquent的熟悉快捷方法。

创建模型

$userRepository->create(['first_name' => 'John', 'last_name' => 'Doe']);

使用给定参数创建用户并返回创建的模型实例。

返回所有模型

$userRepository->all();

查找并返回所有用户及其所有允许的列。

返回所有指定列的模型

$userRepository->get(['id', 'first_name']);

查找并返回所有指定列的用户。您可以选择跳过列列表,方法将表现得与all()相同。

分页并返回给定“每页”值的所有模型

$userRepository->paginate(10);

使用给定的“每页”值分页所有用户并返回分页结果。

通过主键查找用户

$userRepository->find(1); 

查找给定主键的用户并返回模型实例。如果模型不可用,将抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

返回给定“where”语句的所有用户

$userRepository->getWhere('first_name', 'John');

返回first_name为“John”的所有用户。

您也可以在第一个参数中传递多个“where”语句,并省略第二个参数。

$userRepository->getWhere(['first_name' => 'John', 'last_name' => 'Doe']);

返回first_name为“John”且last_name为“Doe”的所有用户。

返回给定“where”语句的第一个用户

$userRepository->getWhereFirst('first_name', 'John');

返回first_name为“John”的第一个用户。

您也可以在第一个参数中传递多个“where”语句,并省略第二个参数。

$userRepository->getWhereFirst(['first_name' => 'John', 'last_name' => 'Doe']);

返回first_name为“John”且last_name为“Doe”的第一个用户。

返回给定“whereIn”语句的所有用户

$userRepository->getWhereIn('first_name', ['John', 'Jane', 'Dave']);

返回first_name为“John”,“Jane”或“Dave”的所有用户。

返回给定“whereIn”语句的第一个用户

$userRepository->getWhereInFirst('first_name', ['John', 'Jane', 'Dave']);

返回first_name为“John”,“Jane”或“Dave”的第一个用户。

使用给定属性更新模型

$user = $userRepository->find(1);
$userRepository->update($user, ['first_name' => 'Dave']);
$userRepository->findAndUpdate(1, ['first_name' => 'Dave']); // finds user with ID=1, updates it with given values and returns instance

$user模型的第一名称为“Dave”并返回更新后的实例。

使用主键查找模型并更新给定属性

$userRepository->findAndUpdate(1, ['first_name' => 'Dave']);

查找给定主键的用户,将first_name更新为“Dave”并返回更新后的实例。如果模型不可用,将抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

删除模型

$user = $userRepository->find(1);
$userRepository->delete($user);

删除$user模型。

使用主键查找模型并删除

$userRepository->findAndDelete(1);

查找给定主键的用户并删除。如果模型不可用,将抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

查找“软删除”模型

$userRepository->findFromTrashed(1);

根据给定的主键查找“软删除”用户。如果模型没有使用“软删除”功能,则会抛出BadMethodCallException异常。如果模型不可用,将抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

恢复“软删除”模型

$user = $userRepository->findFromTrashed(1);
$userRepository->restore($user);

恢复一个“软删除”的$user模型。如果模型没有使用“软删除”功能,方法将抛出BadMethodCallException异常。

使用主键查找“软删除”模型并恢复

$userRepository->findAndRestore(1);

根据给定的主键查找“软删除”用户并恢复。如果模型没有使用“软删除”功能,方法将抛出BadMethodCallException异常。如果模型不可用,将抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

标准

该包使用“标准”来创建灵活的查询。要使用标准链,请使用存储库的withCriteria()方法。可用标准的列表

预加载

使用Adamkhoa03\EloquentRepository\Repository\Eloquent\Criteria\EagerLoad通过查询预加载关系。

$userRepository->withCriteria(new EagerLoad('posts', 'country'))->get();

这将返回所有具有postscountry关系的用户,并预加载。

作用域

使用Adamkhoa03\EloquentRepository\Repository\Eloquent\Criteria\Scope应用Eloquent查询作用域。

$userRepository->withCriteria(new Scope('active', 'admin'))->get();

这将应用activeactive作用域到查询,并返回所有可用用户。

排序

使用Adamkhoa03\EloquentRepository\Repository\Eloquent\Criteria\OrderBy按指定的列和类型排序结果。

$userRepository->withCriteria(new OrderBy('username', 'asc'))->get();

这将按升序排序用户名列并返回所有用户。

最新

使用Adamkhoa03\EloquentRepository\Repository\Eloquent\Criteria\Latest按指定的列和降序排序结果。

$userRepository->withCriteria(new OrderBy('username'))->get();

这将按降序排序用户名列并返回所有用户。

您可以在同一时间向存储库应用多个作用域。

$userRepository->withCriteria([
    new EagerLoad('posts', 'country'),
    new Scope('active', 'admin'),
    new OrderBy('id')
])->get();

您可以为自定义标准类创建实例,并使用withCriteria()方法使用它们。每个标准类都必须实现Adamkhoa03\EloquentRepository\Repository\Criteria\Criterion接口。该接口需要实现apply($entity)方法

use Adamkhoa03\EloquentRepository\Repository\Criteria\Criterion;

class Ascending implements Criterion
{
    /**
     * @var string
     */
    private $column;

    /**
     * @param string $column
     */
    public function __construct($column = 'id')
    {
        $this->column = $column;
    }

    /**
     * @param $entity
     *
     * @return mixed
     */
    public function apply($entity)
    {
        return $entity->orderBy($this->column, 'asc');
    }
}

缓存

存储库也支持缓存模型。要启用缓存,请将您的存储库实现为Adamkhoa03\EloquentRepository\Repository\Contracts\Cacheable接口

namespace App\Repositories;

use App\User;
use Adamkhoa03\EloquentRepository\Repository\Contracts\Cacheable;
use Adamkhoa03\EloquentRepository\EloquentRepository;

class UserRepository extends EloquentRepository implements Cacheable
{
    protected $entity = User::class;
}

实现后,allfind()方法将缓存结果。当使用update()findAndUpdate()delete()findAndDelete()方法时,存储库将自动清空缓存。

您可以在您的存储库中实现cacheKey()方法来设置缓存键。默认是模型的表名。

您可以使用$cacheTTL属性设置缓存生存时间。默认设置为3600(1小时)。或者,您可以在存储库中实现cacheTTL()方法以返回缓存生存时间值。当实现cacheTTL()方法时,存储库将忽略$cacheTTL属性值。

您可以在存储库中实现invalidateCache($model)方法以更改在update()findAndUpdate()delete()findAndDelete()方法使用时的缓存失效逻辑。

测试

composer test

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

有关详细信息,请参阅贡献

安全

如果您发现任何与安全相关的问题,请通过电子邮件ahmadov90@gmail.com发送,而不是使用问题跟踪器。

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件