adamkhoa03 / eloquent-repository
Laravel的Eloquent仓库
Requires
- php: ^7.3|^8.0
- illuminate/console: ^6.0|^7.0|^8.0
- illuminate/container: ^6.0|^7.0|^8.0
- illuminate/contracts: ^6.0|^7.0|^8.0
- illuminate/database: ^6.0|^7.0|^8.0
- illuminate/support: ^6.0|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
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();
这将返回所有具有posts和country关系的用户,并预加载。
作用域
使用Adamkhoa03\EloquentRepository\Repository\Eloquent\Criteria\Scope应用Eloquent查询作用域。
$userRepository->withCriteria(new Scope('active', 'admin'))->get();
这将应用active和active作用域到查询,并返回所有可用用户。
排序
使用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; }
实现后,all和find()方法将缓存结果。当使用update()、findAndUpdate()、delete()和findAndDelete()方法时,存储库将自动清空缓存。
您可以在您的存储库中实现cacheKey()方法来设置缓存键。默认是模型的表名。
您可以使用$cacheTTL属性设置缓存生存时间。默认设置为3600(1小时)。或者,您可以在存储库中实现cacheTTL()方法以返回缓存生存时间值。当实现cacheTTL()方法时,存储库将忽略$cacheTTL属性值。
您可以在存储库中实现invalidateCache($model)方法以更改在update()、findAndUpdate()、delete()和findAndDelete()方法使用时的缓存失效逻辑。
测试
composer test
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
有关详细信息,请参阅贡献。
安全
如果您发现任何与安全相关的问题,请通过电子邮件ahmadov90@gmail.com发送,而不是使用问题跟踪器。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。