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)。有关更多信息,请参阅许可文件。