Подтвердить что ты не робот

Что вы используете вместо ENUM в doctrine2?

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

4b9b3361

Ответ 1

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

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

    protected $status = self::STATUS_ACTIVE;
}

Это работает очень хорошо и упрощает работу с тем, что вы бы назвали ENUMS в среде IDE.

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

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

Ответ 2

Postgres, symfony, orm, doctrine...

  • Postgress Определяет новый тип перечисления (pgAdmin)

СОЗДАТЬ ТИП new_enum AS ENUM ('sad', 'ok', 'happy');

  1. В Entity

@ORM\Column (name= "name", type = "string", columnDefinition = "new_enum", обнуляемый = истина)

  1. В config.yml

mapping_types:
    new_enum: string

# 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 # <=======

Ответ 3

Вы должны использовать 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);