tuscanicz/doctrine-data-applier

用于 Doctrine 数据迁移的 Symfony 扩展,通过 doctrine 实体来管理数据。

v0.9.1 2017-05-31 08:36 UTC

This package is not auto-updated.

Last update: 2024-09-25 01:33:00 UTC


README

用于 Doctrine 数据迁移的 Symfony 扩展,通过 doctrine 实体来管理数据。使用这个工具通过 doctrine 实体描述您的数据库数据。您需要稍微修改您的实体,但为此代价,您将获得一个强大的工具,它将自动合并应用程序中的实体与数据库中的实体。

当您需要在不计其数的环境中保持数据最新并且应用程序运行所必需时,这非常有用。

典型用例是一个包含管理员、内容经理和其他“必需”用户或跨应用程序使用的枚举的用户表。

DataApplier 将 永远不会影响任何 DataApplier 未创建的数据,因此您的用户数据可以与数据应用者的数据一起存在于同一表中。

如何使用

添加 composer 依赖: composer require tuscanicz/doctrine-data-applier:dev-develop

修改您的实体以适用于数据应用者

您需要向 doctrine 实体添加一些列,使其可由数据应用者管理。

为了做到这一点,您必须实现 DataApplier\Entity\DataApplicableEntityInterface,这将迫使您使用 DataApplier\Entity\DataApplicableEntityTrait,并使用设置器和获取器展示 id 列。

此 id 必须是数据库中的主键,见典型的注解

/**
 * @var int
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue()
 */
private $id;

public function getId()
{
    return $this->id;
}

public function setId(int $id)
{
    $this->id = $id;
}

我预计大多数 doctrine 实体已经定义了这样的列。如果您使用不同的名称定义了 id 或包含复杂的键,您将不得不分叉此存储库并修复此限制:)

接下来,您需要决定哪些是 DataApplier 标识符列。

此工具将根据与您的应用程序中的实体匹配数据库内容来决定是否删除行、更新数据或插入新行。

DataApplier\Annotation\DataApplierIdentifier 进行注解

/**
 * @var string
 * @ORM\Column(type="string")
 * @DataApplierIdentifier()
 */
private $key;

然后创建一个工厂方法/或工厂类,该类将设置所有必要的属性到您的实体。不要包括数据库中的主键(id),这些属性将在您的环境中有所不同。

示例

public static function createNew($value, $key)
{
    $self = new self;
    $self->setKey($key);
    $self->setValue($value);

    return $self;
}

更新数据库

使用 doctrine:migrations 更改实体。生成差异将添加一些列,这将帮助 DataApplier 识别数据来源。

为您的实体创建 DataApplier

Data 应用者由多个实现 DataApplier\Data\DataApplierInterface 的 DataAppliers 组成。

唯一的 applyData() 方法将返回您需要在数据库中保留的实体数组

class TestDataApplier1 implements DataApplierInterface
{
    public function applyData()
    {
        return [
            TestEntity::createNew('value1', 'key1'),
            TestEntity::createNew('value2', 'key2'),
            TestEntity::createNew('value3', 'key3'),
        ];
    }
}

您必须将 TestDataApplier1 注册为 Symfony 服务并添加 doctrine.data_applier 标签

<service id="your_app.data.test_data_applier1" class="YourApp\Data\TestDataApplier1">
    <tag name="doctrine.data_applier"/>
</service>

注册 DataApplier 扩展

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            ...,
            new \DataApplier\DataApplierBundle()
        ];
    }
}

运行 DataApplier

如果您已经完成了所有前面的步骤 - 恭喜!:)

您现在可以通过 Symfony 控制台运行数据应用者:php bin/console data:apply

这将更新您数据库中的数据。