0

我正在尝试将自定义类型映射到字符串。这是我的实体定义:

/**
 * @var string
 * 
 * @ORM\Column(name="type", type="string", columnDefinition="my_type_enum", nullable=false)
 */

但是当我尝试创建迁移(迁移:差异)时,这是输出

[Doctrine\DBAL\DBALException]my_type_enum请求的未知数据库类型,Doctrine\DBAL\Platforms\PostgreSQL92Platform可能不支持它。

似乎我需要使用 将我的自定义类型映射my_type_enum到一个字符串mapping_types,但是 Zend Expressive 在哪里?看来我的配置被忽略了

...
     'doctrine' => [
       'dbal' => [
         'mapping_types' => [
           'my_type_enum' => 'string'
         ]
       ]
     ]
...
4

2 回答 2

3

zend-expressive 本身没有内置的学说支持。它取决于您正在使用的学说模块及其工厂。工厂使用配置启动教义服务。因此,我会查看学说工厂,以了解它如何以及是否支持自定义映射类型。

如果你的不支持它,你可以使用container-interop-doctrine。它似乎支持这个内置的(我自己没有尝试过):

<?php
return [
    'doctrine' => [
        // ...
        'connection' => [
            'orm_default' => [
                'driver_class' => \Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                'wrapper_class' => null,
                'pdo' => null,
                'configuration' => 'orm_default', 
                'event_manager' => 'orm_default', 
                'params' => [],
                'doctrine_mapping_types' => [], // <-----
                'doctrine_commented_types' => [],
            ],
        ],
        'types' = [
            'typename' => Type::class,
        ], // <-----
    ],
];
于 2016-09-23T06:53:39.563 回答
2

首先,您必须创建扩展学说 DBAL 类型的自定义类型:

<?php
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;

class MyType extends Type
{
    const MYTYPE = 'mytype';

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
        return 'mytype';
    }

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        // convert your type to php value
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        // convert your type to database value
    }
}

最近我集成了一个值对象作为一个学说类型,所以你可以看看你的新类型应该是什么样子:PostcodeType

下一步是注册新类型,比如在您的教义引导程序或 EntityManagerFactory 中:

<?php // ./src/Container/EntityManagerFactory.php

if (!\Doctrine\DBAL\Types\Type::hasType("mytype")) {
    \Doctrine\DBAL\Types\Type::addType('mytype', 'Your\Namespace\MyType');
    $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('mytype', 'mytype');
}

return $em;

最后你已经注册了你的新类型,你可以使用它了:

/**
 * @var \Your\Namespace\MyType
 * @Column(type="mytype")
 */
protected $param;
于 2016-11-21T11:54:16.770 回答