orkhanahmadov/eloquent-repository

Laravel的Eloquent仓库

3.0.0 2022-03-14 12:50 UTC

This package is auto-updated.

Last update: 2024-09-14 18:20:47 UTC


README

Latest Stable Version Latest Unstable Version Total Downloads License

Build Status Test Coverage Maintainability Quality Score StyleCI

为Laravel创建的Eloquent仓库包,完全基于“仓库模式”。

要求

版本要求及与Laravel的兼容性

版本 ^3.0 - Laravel ^9.0 或更高版本以及 PHP 8.0 或更高版本。

版本 ^2.0 - Laravel ^6.0^7.0^8.0 或更高版本以及 PHP 7.3 或更高版本。

版本 ^1.0 - Laravel 5.55.65.75.8 以及 PHP 7.1 或更高版本。

安装

您可以通过composer安装此包

composer require orkhanahmadov/eloquent-repository

用法

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

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

namespace App\Repositories;

use App\User;
use Orkhanahmadov\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();
    }
}

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

namespace App\Http\Controllers;

use App\User;
use Orkhanahmadov\EloquentRepository\EloquentRepository;

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

可用方法

Eloquent仓库类提供了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 模型的 first_name 为 "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() 方法。可用条件列表

预加载

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

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

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

范围

使用 Orkhanahmadov\EloquentRepository\Repository\Eloquent\Criteria\Scope 应用 Eloquent 查询范围。

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

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

排序

使用 Orkhanahmadov\EloquentRepository\Repository\Eloquent\Criteria\OrderBy 根据指定的列和类型对结果进行排序。

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

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

最新

使用 Orkhanahmadov\EloquentRepository\Repository\Eloquent\Criteria\Latest 根据指定的列和降序顺序对结果进行排序。

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

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

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

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

您可以通过创建自己的条件类并使用 withCriteria() 方法来使用它们。每个条件类都必须实现 Orkhanahmadov\EloquentRepository\Repository\Criteria\Criterion 接口。此接口要求实现 apply($entity) 方法

use Orkhanahmadov\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');
    }
}

缓存

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

namespace App\Repositories;

use App\User;
use Orkhanahmadov\EloquentRepository\Repository\Contracts\Cacheable;
use Orkhanahmadov\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

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

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

致谢

许可

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