Dav*_*idW 37 symfony doctrine-orm
在Doctrine2中你用什么而不是ENUM?SMALLINT?我想过使用varchar,或者明确定义char,但是当涉及到索引时,这可能不是很有效,或者我错了?
Ocr*_*ius 68
我通常使用映射到类常量的整数,比如
class MyEntity {
const STATUS_INACTIVE = 0;
const STATUS_ACTIVE = 1;
const STATUS_REFUSE = 2;
protected $status = self::STATUS_ACTIVE;
}
Run Code Online (Sandbox Code Playgroud)
这非常好用,可以更轻松地使用IDE中的ENUMS.
您还可以使用文档中描述的可枚举类型,但这意味着您必须为每个枚举列定义一个自定义类型.这是很多工作,没有真正的好处.
您可能还想知道为什么不应该使用枚举.
Postgres,symfony,orm,doctrine ......
CREATE TYPE new_enum AS ENUM('sad','ok','happy');
@ORM\Column(name ="name",type ="string",columnDefinition ="new_enum",nullable = true)
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 # <=======
Run Code Online (Sandbox Code Playgroud)
如果您希望使用 MySQL 和 Symfony 进行 MySQL ENUM,您现在可以使用一种简单的方法来实现,无需任何依赖
<?php
namespace App\Enum;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
abstract class EnumType extends Type
{
protected $name;
protected $values = [];
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$values = array_map(function($val) { return "'".$val."'"; }, $this->values);
return "ENUM(".implode(", ", $values).")";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!in_array($value, $this->values)) {
throw new \InvalidArgumentException("Invalid '".$this->name."' value.");
}
return $value;
}
public function getName()
{
return $this->name;
}
public function requiresSQLCommentHint(AbstractPlatform $platform)
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
namespace App\Enum;
class UploadFileStatusType extends EnumType
{
const OPEN = 'open';
const DONE = 'done';
const ERROR = 'error';
protected $name = self::class;
protected $values = [
self::OPEN => self::OPEN ,
self::DONE => self::DONE,
self::ERROR => self::ERROR,
];
}
Run Code Online (Sandbox Code Playgroud)
doctrine:
dbal:
types:
UploadFileStatusType: App\Enum\UploadFileStatusType
Run Code Online (Sandbox Code Playgroud)
class MyEntity
{
/**
* @var string
*
* @ORM\Column(type="UploadFileStatusType")
*/
protected $status;
}
Run Code Online (Sandbox Code Playgroud)
enum('open', 'done', 'error')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38599 次 |
| 最近记录: |