orkhanahmadov / eloquent-repository
Laravel的Eloquent仓库
Requires
- php: ^8.0
- illuminate/console: ^9.0
- illuminate/container: ^9.0
- illuminate/contracts: ^9.0
- illuminate/database: ^9.0
- illuminate/support: ^9.0
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.0
README
为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.5,5.6,5.7,5.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();
这将返回所有具有 posts
和 country
关系的用户,并且这些关系被预加载。
范围
使用 Orkhanahmadov\EloquentRepository\Repository\Eloquent\Criteria\Scope
应用 Eloquent 查询范围。
$userRepository->withCriteria(new Scope('active', 'admin'))->get();
这将应用 active
和 active
范围到查询,并返回所有可用用户。
排序
使用 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; }
实现后,all
和 find()
方法将缓存结果。当使用 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)。有关更多信息,请参阅许可文件。