view-components/eloquent-data-processing

ViewComponents 的 Eloquent ORM 支持

v1.2.7 2021-07-06 16:24 UTC

This package is auto-updated.

Last update: 2024-09-06 23:21:10 UTC


README

Release Build Status Scrutinizer Code Quality Code Coverage

ViewComponents 的 Eloquent ORM 支持

目录

需求

  • PHP 5.5+ (hhvm & php7 都受支持)

安装

安装此组件的推荐方式是通过 Composer.

运行以下命令

composer require view-components/eloquent-data-processing

用法

创建数据提供者

EloquentDataProvider 支持三种类型的数据源

  • Illuminate\Database\Eloquent\Builder 实例(从模型创建的数据库查询构建器)
  • Illuminate\Database\Query\Builder 实例(标准数据库查询构建器,不了解模型)
  • Eloquent 模型的类名

使用 Eloquent 模型类名作为数据源

use MyApp\UserModel;
use ViewComponents\Eloquent\EloquentDataProvider;
$provider = new EloquentDataProvider(UserModel::class);

如果使用 Eloquent 模型类名作为数据源,修改数据库查询的唯一方法是指定数据提供者操作

use ViewComponents\ViewComponents\Data\Operation\FilterOperation;

$provider->operations()->add(
    new FilterOperation('role', FilterOperation::OPERATOR_EQ, 'Manager')
);

使用 Illuminate\Database\Eloquent\Builder 作为数据源

use ViewComponents\Eloquent\EloquentDataProvider;

$provider = new EloquentDataProvider((new MyApp\UserModel)->newQuery());

在创建 EloquentDataProvider 之前可以指定查询部分,但请注意,查询的某些部分可能会被数据提供者操作所更改。

use ViewComponents\Eloquent\EloquentDataProvider;

$query = MyApp\UserModel
            ::where('role', '=', 'Manager')
            ->where('company', '=', 'Facebook')
            ->orderBy('id');

$provider = new EloquentDataProvider($query);

使用 Illuminate\Database\Query\Builder 作为数据源

如果您不处理 Eloquent 模型,则可以使用 EloquentDataProvider。

use DB;
use ViewComponents\Eloquent\EloquentDataProvider;

$provider = new EloquentDataProvider(
    DB::table('users')->where('name', '=', 'David')
);

数据提供者操作

当 Eloquent 数据提供者有操作时,它会修改数据库查询。

使用 operations() 方法访问操作集合。

有关集合的文档可以在 这里 找到。

添加操作的示例

$provider
    ->operations()
    ->add(new SortOperation('id', SortOperation::ASC));

也可以在创建数据提供者时指定操作

use MyApp\UserModel;
use ViewComponents\Eloquent\EloquentDataProvider;
use ViewComponents\ViewComponents\Data\Operation\FilterOperation;

$provider = new EloquentDataProvider(
    UserModel::class
    [
        new FilterOperation('role', FilterOperation::OPERATOR_EQ, 'Manager')
        new SortOperation('id', SortOperation::DESC),
    ]
);

提取数据

数据提供者实现了 IteratorAggregate 接口,因此您可以像数组一样迭代它

use MyApp\UserModel;
use ViewComponents\Eloquent\EloquentDataProvider;

$provider = new EloquentDataProvider(UserModel::class);
foreach ($provider as $user) {
   var_dump($user); // instance of UserModel
}

数据提供者在调用 getIterator() 方法或迭代开始时(如果数据尚未加载)执行 DB 查询,即调用 getIterator() 两次不会产生 2 个数据库查询。但是更改操作集合会导致重置缓存

use MyApp\UserModel;
use ViewComponents\Eloquent\EloquentDataProvider;
use ViewComponents\ViewComponents\Data\Operation\FilterOperation;

$provider = new EloquentDataProvider(UserModel::class);
// databse query will be executed 
$provider->getIterator();

// databse query will not be executed again, iterating over same data 
$provider->getIterator();

$provider->operations->add(
  new FilterOperation('id', FilterOperation::OPERATOR_LTE, 5)
)
// databse query will be executed again
$provider->getIterator();

贡献

有关详细信息,请参阅 贡献指南行为准则

测试

此包包含单元测试(PHPUnit)。

要本地运行测试,您必须将此包作为具有开发依赖项的独立项目安装

composer create-project view-components/eloquent-data-processing

运行测试的命令

composer test

安全

如果您发现任何与安全相关的问题,请通过电子邮件 mail@vitaliy.in 联系,而不是使用问题跟踪器。

许可证

© 2015 — 2016 Vitalii Stepanenko

根据 MIT 许可证授权。

有关更多信息,请参阅 许可证文件