sebastian-berc/repositories

此软件包已被废弃且不再维护。未建议替代软件包。

灵活的 Laravel ~5.0 仓库库。

v1.0.3 2020-03-04 12:17 UTC

This package is auto-updated.

Last update: 2023-08-04 19:20:36 UTC


README

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

安装

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