Php 如何使用doctrine和symfony2的自定义枚举数据类型将枚举值保存到数据库?
这是我原来问题的后续问题: 我已成功地按照以下说明添加了枚举数据类型: 更具体地说,我使用了解决方案2,使用后一部分创建了一个基本EnumType类,然后对其进行了如下扩展:Php 如何使用doctrine和symfony2的自定义枚举数据类型将枚举值保存到数据库?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,这是我原来问题的后续问题: 我已成功地按照以下说明添加了枚举数据类型: 更具体地说,我使用了解决方案2,使用后一部分创建了一个基本EnumType类,然后对其进行了如下扩展: <?php namespace CP\AdminBundle\DataTypes; class EnumContactBasicGender extends EnumType { protected $name = 'EnumContactBasicGender'; protected $valu
<?php
namespace CP\AdminBundle\DataTypes;
class EnumContactBasicGender extends EnumType
{
protected $name = 'EnumContactBasicGender';
protected $values = array('m','f');
}
但是,如果我像上面注释的行一样通过这个类,我也会得到一个错误
有人能解释一下我需要如何设置所需的值吗?条令不完全支持枚举。枚举类型看起来很专业,但没有人以这种方式使用枚举。解决方法是在具有整数值的实体中设置几个静态变量,并将枚举字段设置为整数类型 关于你的问题,我将改变性别的设定者:
- 没有方法参数类型并传递一个简单字符串
- 从字符串生成枚举对象
- 将枚举对象指定给实体
Max我面临着一个非常类似的问题,我通过在XXXEnumType类中添加相同的值数组来解决,但它是公共的和静态的,这样我就在一个地方指定了枚举的内容,从任何地方访问它,并对它进行访问:) 但首先,检查您是否在app/config/config.yml中添加了my_foo_类型:
# Doctrine Configuration
doctrine:
dbal:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
types:
my_foo_type: use XXX\DBAL\XXXEnumType
mapping_types:
enum: string
希望有帮助
Linuxatico我认为这很有帮助,我已经处理了4天了,我想我要做的是,最简单的方法可能是将我的枚举作为字符串处理,一旦我完成了对遗留应用程序的重新编码,就通过mysql将这些字段转换回枚举,忘记使用symfony命令行更新数据库模式,我只能自己做了!按照我发布的方式,枚举被当作字符串处理,另外还有一个控件,如果插入与指定字符串不同的字符串,则会引发错误
<?php
namespace CP\AdminBundle;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class CPAdminBundle extends Bundle
{
public function boot()
{
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('EnumContactBasicGender', 'CP\AdminBundle\DataTypes\EnumContactBasicGender');
Type::addType('EnumContactBasicType', 'CP\AdminBundle\DataTypes\EnumContactBasicType');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('EnumContactBasicGender','EnumContactBasicGender');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('EnumContactBasicType','EnumContactBasicType');
}
}
<?php
namespace CP\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* CP\AdminBundle\Entity\ContactBasic
*
* @ORM\Table(name="contacts_basics")
* @ORM\Entity(repositoryClass="CP\AdminBundle\Entity\ContactBasicRepository")
*/
class ContactBasic
{
/** Field #1 (contacts_id) **/
/**
* @var integer $contacts_id
* @ORM\Column(type="integer",nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $contacts_id;
/** enum ('m','f') **/
/**
* @ORM\Column(type="EnumContactBasicGender",nullable=false)
*/
private $gender;
/** enum ('non-customer','customer','blacklisted') **/
/**
* @ORM\Column(type="EnumContactBasicType",nullable=false)
*/
private $type;
/** more omitted properties here **/
/**
* Set gender
*
* @param EnumContactBasicGender $gender
*/
public function setGender(\EnumContactBasicGender $gender)
{
$this->gender = $gender;
}
/**
* Get gender
*
* @return EnumContactBasicGender
*/
public function getGender()
{
return $this->gender;
}
/**
* Set type
*
* @param EnumContactBasicType $type
*/
public function setType(\EnumContactBasicType $type)
{
$this->type = $type;
}
/**
* Get type
*
* @return EnumContactBasicType
*/
public function getType()
{
return $this->type;
}
/** more omitted setters and getters here **/
}
<?php
namespace CP\AdminBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use CP\AdminBundle\Entity\ContactBasic;
use CP\AdminBundle\DataTypes\EnumContactBasicGender;
use CP\AdminBundle\DataTypes\EnumContactBasicType;
class ContactBasicLoader implements FixtureInterface
{
public function load(ObjectManager $manager)
{
$contact = new ContactBasic();
// $contact->setGender(new EnumContactBasicGender());
$contact->setGender('m');
// $contact->setType(new EnumContactBasicType());
$contact->setType('customer');
$manager->persist($contact);
$manager->flush();
}
}
Catchable Fatal Error: Argument 1 passed to CP\AdminBundle\Entity\ContactBasic::setGender() must be an instance of EnumContactBasicGender, string given
# Doctrine Configuration
doctrine:
dbal:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
types:
my_foo_type: use XXX\DBAL\XXXEnumType
mapping_types:
enum: string
<?php
namespace XXX\DBAL;
class XXXEnumType extends EnumType
{
protected $name = 'enum_xxx';
protected $values = array('first', 'second', 'last');
public static $static_name = 'enum_xxx';
public static $static_values = array('first', 'second', 'last');
public function getValues()
{
return $this->values;
}
}
use XXX\DBAL\XXXEnumType;
foreach (XXXEnumType::$static_values as $value)
{
//do some stuff
}