Что вы используете вместо ENUM в doctrine2? - PullRequest
36 голосов
/ 06 января 2012

Что вы используете вместо ENUM в Doctrine2? SMALLINT? Я думал об использовании varchar или явном определении char, но это может быть не очень эффективно, когда дело касается индексов, или я ошибаюсь?

Ответы [ 3 ]

66 голосов
/ 30 января 2012

Я обычно работаю с целыми числами, сопоставленными с константами классов, например,

class MyEntity {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    const STATUS_REFUSE = 2;

    protected $status = self::STATUS_ACTIVE;
}

. Это прекрасно работает и делает работу с ENUMS в IDE еще проще.

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

Возможно, вы также захотите узнать , почему вы не должны использовать перечисления .

8 голосов
/ 03 декабря 2014

Postgres, symfony, orm, доктрина ...

  1. Postgress Определение нового типа enum (pgAdmin)

CREATE TYPEnew_enum AS ENUM («грустно», «хорошо», «счастливо»);

В сущности

@ ORM \ Column (имя = "имя", тип = "строка", columnDefinition = "new_enum", nullable = true)

В config.yml

mapping_types:new_enum: строка

# Doctrine Configuration
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        mapping_types:
            new_enum: string # <=======
0 голосов
/ 30 апреля 2019

Вы должны использовать fre5h / DoctrineEnumBundle для доктрины при использовании symfony:

Пример использования

Создать класс для нового типа ENUM BasketballPositionType:

<?php
namespace App\DBAL\Types;

use Fresh\DoctrineEnumBundle\DBAL\Types\AbstractEnumType;

final class BasketballPositionType extends AbstractEnumType
{
    public const POINT_GUARD = 'PG';
    public const SHOOTING_GUARD = 'SG';
    public const SMALL_FORWARD = 'SF';
    public const POWER_FORWARD = 'PF';
    public const CENTER = 'C';

    protected static $choices = [
        self::POINT_GUARD => 'Point Guard',
        self::SHOOTING_GUARD => 'Shooting Guard',
        self::SMALL_FORWARD => 'Small Forward',
        self::POWER_FORWARD => 'Power Forward',
        self::CENTER => 'Center'
    ];
}

Зарегистрируйте BasketballPositionType для Doctrine в config.yml:

doctrine:
    dbal:
        types:
            BasketballPositionType: App\DBAL\Types\BasketballPositionType

Создать объект Player, имеющий поле позиции:

<?php
namespace App\Entity;

use App\DBAL\Types\BasketballPositionType;
use Doctrine\ORM\Mapping as ORM;
use Fresh\DoctrineEnumBundle\Validator\Constraints as DoctrineAssert;

/**
 * @ORM\Entity()
 * @ORM\Table(name="players")
 */
class Player
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * Note, that type of a field should be same as you set in Doctrine config
     * (in this case it is BasketballPositionType)
     *
     * @ORM\Column(name="position", type="BasketballPositionType", nullable=false)
     * @DoctrineAssert\Enum(entity="App\DBAL\Types\BasketballPositionType")     
     */
    protected $position;

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

    public function setPosition(string $position)
    {
        $this->position = $position;
    }

    public function getPosition(): string
    {
        return $this->position;
    }
}

Теперь вы можете установить позицию для игрока внутри какого-либо действия или где-то еще:

$player->setPosition(BasketballPositionType::POINT_GUARD);
...