Что вы используете вместо ENUM в Doctrine2? SMALLINT? Я думал об использовании varchar или явно определял char, но это может быть не очень эффективным, когда дело доходит до индексов, или я ошибаюсь?
Что вы используете вместо ENUM в doctrine2?
Ответ 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');
- В Entity
@ORM\Column (name= "name", type = "string", columnDefinition = "new_enum", обнуляемый = истина)
- В 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);