Как добавить пользовательский параметр в Doctrine Тип столбца - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь создать пользовательский тип столбца, но SQL должен зависеть от пользовательского параметра. Типы по умолчанию обрабатывают эти параметры без проблем, например. Тип строки имеет длину. Как я могу добавить один для моего типа.

Пример того, что я пытаюсь сделать:

class EnumType extends Type
{
    const ENUM = 'enum';

    public function getName(): string
    {
        return self::ENUM;
    }

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
    {
        $class = $fieldDeclaration['class'];

        if (!is_subclass_of($class, Enum::class)) {
            throw new \Exception('You must specify a valid enum class');
        }

        $values = call_user_func([$class, 'getValues']);

        return "ENUM('" . implode("', '", $values) . "')";
    }

    public function convertToPHPValue($value, AbstractPlatform $platform): ?Point
    {
        return $value;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
    {
        return $value;
    }

    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }
}

Пока я пытался:

    /**
     * @var string
     * @ORM\Column(type="enum", class="App\Enums\OrderStatus")
     */
    protected $status;

    /**
     * @var string
     * @ORM\Column(type="enum", options={"class":"App\Enums\OrderStatus"})
     */
    protected $status;

Первый сделал вообще не работает, показывая ошибку, что поле класса не определено. Второй работал нормально, но затем всегда пытался переделать столбец, так как он не обнаруживал class при загрузке определения из базы данных.

1 Ответ

0 голосов
/ 29 января 2020

Вы забыли настроить типы в config/packages/doctrine.yaml?

Он должен выглядеть следующим образом:

doctrine:
   dbal:
      types:
         enum: 'App\Doctrine\Types\EnumType' #Change it to valid class

и в разделе подключения добавить тип отображения:

doctrine:
   dbal:
      connections:
         default:
            mapping_types:
               enum: enum
...