sebastian-berc / repositories
灵活的 Laravel ~5.0 仓库库。
Requires
- php: >=5.5.9
- illuminate/contracts: ~5.0|~5.1|^6.0|^7.0
- illuminate/database: ~5.0|~5.1|^6.0|^7.0
Requires (Dev)
- fzaninotto/faker: ^1.4
- laracasts/testdummy: ^2.3
- mockery/mockery: ^0.9.4
- orchestra/testbench: 3.0.*
- phpunit/phpunit: 4.*
- scrutinizer/ocular: ~1.1
This package is auto-updated.
Last update: 2023-08-04 19:20:36 UTC
README
安装
通过 Composer
$ composer require sebastian-berc/repositories
使用
通过扩展抽象类 \SebastianBerc\Repositories\Repository
并实现 takeModel
方法创建自己的仓库
class MyRepository extends \SebastianBerc\Repositories\Repository { /** * Return fully qualified model class name. * * @return string */ public function takeModel() { return MyModel::class } }
依赖注入使用
在 Laravel 提供依赖注入的地方,您可以这样绑定您的仓库
class UsersController extends Controller { /** * Contains users repository. * * @var UsersRepository */ protected $repository; /** * Creates a new instance of users controller. * * @param UsersRepository $repository */ public function __construct(UsersRepository $repository) { $this->repository = $repository; } }
无依赖注入使用
如果您需要一个不带依赖注入的仓库,您可以使用如下静态方法
/** * Creates a new users. */ public function store(Request $request) { $repository = UsersRepository::instance(); return $repository->create($request->all()); }
方法
这为您提供了访问以下方法的能力...
创建一个新查询以获取仓库中的所有结果
// Definition: $repository->all(array $columns = ['*']); // Example: $users = $repository->all(['name', 'value']);
[需要修复] 在模型上创建一个新基本 WHERE 查询子句并返回结果
// Definition: $repository->where($column, $operator = '=', $value = null, $boolean = 'and', array $columns = ['*']); // Example: $repository->where('id', '<>', \Auth::user()->getKey(), 'and', ['activated', 'banned']);
创建一个带有分页的新查询
// Definition: $repository->paginate($perPage = 15, array $columns = ['*']); // Example: $repository->paginate(50, ['name', 'value']);
保存新模型并返回实例
// Definition: $repository->create(array $attributes = []); // Example: $repository->create(['activated' => true, 'banned' => false]);
在数据库中保存或更新模型。
// Definition: $repository->update($identifier, array $attributes = []); // Example: $repository->update(1, ['activated' => true, 'banned' => false]);
您还可以传递一个模型
// Definition: $repository->update($dirtyModel); // Example: $model = $repository->find(1); $model->activated = true; $repository->update($model);
甚至带有附加属性
// Definition: $repository->update($dirtyModel, ['activated' => true]); // Example: $model = $repository->find(1); $model->activated = true; $repository->update($model, ['banned' => false]);
从数据库中删除模型
// Definition: $repository->delete($identifier); // Example: $repository->delete(1);
通过主键查找模型(仅返回第一个结果)
// Definition: $repository->find($identifier, array $columns = ['*']); // Example: $repository->find(1, ['name', 'value']);
通过指定的列和值查找模型(仅返回第一个结果)
// Definition: $repository->findBy($column, $value, array $columns = ['*']); // Example: $repository->findBy('activated', true, ['id']);
通过指定的列和值数组查找模型(仅返回第一个结果)
// Definition: $repository->findWhere(array $wheres, array $columns = ['*']); // Example: $repository->findWhere(['activated' => true, 'banned' => false], ['id']);
根据当前查询返回整个集合的总数
// Definition and example: $repository->count();
按指定列排序和筛选并获取指定页的集合,此方法将返回 LengthAwarePaginator
实例
// Definition: $repository->fetch($page = 1, $perPage = 15, array $columns = ['*'], array $filter = [], array $sort = []); // Example: $repository->fetch(1, 15, ['*'], ['activated' => true, 'banned' => 'false'], ['id' => 'ASC']);
不使用 LengthAwarePaginator
,但按指定列排序和筛选并获取指定页的简单集合
// Definition: $repository->simpleFetch($page = 1, $perPage = 15, array $columns = ['*'], array $filter = [], array $sort = []); // Example: $repository->simpleFetch(1, 15, ['*'], ['activated' => true, 'banned' => 'false'], ['id' => 'ASC']);
预加载
如果您的模型具有关系并且您想加载它,您可以通过调用 with
方法使用查询结果来做这件事,例如
// Definition: $repository->with($relations); // Examples: $repository->with('roles')->all(); $repository->with('roles', 'permissions')->all(); $repository->with(['roles', 'permissions])->all();
条件
有时您需要准备可重复查询,例如,仅显示活跃且未被禁止的用户或上周的最新新闻 - 要这样做,您可以使用条件
class ActivatedAndNotBanned extends \SebastianBerc\Repositories\Criteria { public function execute(Builder $query) { return $query->where(['activated' => true])->andWhere(['banned' => false]); } }
现在您可以使用条件与仓库一起使用
$repository->criteria(new ActivatedAndNotBanned())->all();
转换器
您仓库中的数据可以发送到不同的地方,例如,它可能是您的网站或排除几个列的相同数据与 Web API 共享,您可以通过 Transformer
类实现这一点
class UsersForListing extends \SebastianBerc\Repositories\Transformer { public function transform($item) { $item->fullname = $item->firstName . ' ' . $item->lastName; $item->password = '*****'; return $item; } }
当您有自己的 Transformer
时,您可以将它应用到仓库中
$repository->setTransformer(UsersForListing::class)->all();
缓存仓库结果
要将查询结果存储在缓存中,只需将 ShouldCache
接口的实现添加到您的仓库中即可
class MyRepository extends \SebastianBerc\Repositories\Repository implements \SebastianBerc\Repositories\Contracts\ShouldCache { /** * Return fully qualified model class name. * * @return string */ public function takeModel() { return MyModel::class; } }
这就是它的魔法所在,从现在起,一切都将被缓存 :).
变更日志
请参阅CHANGELOG获取更多关于最近变更的信息。
测试
$ composer test
贡献
请参阅CONTRIBUTING获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件contact@sebastian-berc.pl联系,而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。