coliving / repositories
灵活的 Laravel 6.x & 7.x & 8.x & 9.x, 10.x & 11.x 仓库库。
Requires
- php: ^7.3 | ^8.0 | ^8.1 | ^8.2 | ^8.3
- illuminate/contracts: ^8.0 | ^9.0 | ^10.0 | ^11.0
- illuminate/database: ^8.0 | ^9.0 | ^10.0 | ^11.0
Requires (Dev)
- orchestra/testbench: ^8.1
- phpunit/phpunit: 9.* | 10.* | 11.*
- scrutinizer/ocular: ~1.1
This package is not auto-updated.
Last update: 2024-09-27 10:20:06 UTC
README
安装
通过 Composer
$ composer require coliving/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 = new UsersRepository(); 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)。请参阅 许可证文件 了解更多信息。