coliving/repositories

灵活的 Laravel 6.x & 7.x & 8.x & 9.x, 10.x & 11.x 仓库库。

v1.3.0 2024-05-10 08:19 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status SensioLabs Insight Quality Score Total Downloads

安装

通过 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)。请参阅 许可证文件 了解更多信息。