我在覆盖实体时遇到问题。
我需要字段emailCanonical
不是唯一的。
这就是我所做的:
在我的UserBundle\Resources\config\doctrine\User.orm.xml
中,我根据Doctrine2文档添加了以下attribute-overrides
配置
<attribute-overrides>
<attribute-override name="emailCanonical">
<field column="email_canonical" unique="false" name="emailCanonical" />
</attribute-override>
</attribute-overrides>
然后我运行了以下控制台命令
$ php app/console doctrine:migrations:diff
$ php app/console doctrine:migrations:migrate
一切都很好。 emailCanonical
不是唯一的。
但是现在,当我需要在其他项目包中生成一个实体时,我有一个奇怪的错误:
$ php app/console doctrine:generate:entities SkyModelsBundle:Category
Generating entity "Sky\Bundle\ModelsBundle\Entity\Category"
[Doctrine\ORM\Mapping\MappingException]
Invalid field override named 'emailCanonical' for class 'Sky\Bundle\UserBundle\Entity\User'.
doctrine:generate:entities [--path="..."] [--no-backup] name
但是,如果我从xml映射中删除覆盖设置,一切正常。
答案 0 :(得分:10)
你使用像这样的PHP注释覆盖(从doctrine 2.3及更高版本开始支持这一点,请注意在文档中它提到你不能覆盖类型,但是我能够使用最新版本的doctrine,在撰写本文时,它是2.4.4):
<?php
namespace Namespace\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
* @ORM\Entity
* @ORM\AttributeOverrides({
* @ORM\AttributeOverride(name="id",
* column=@ORM\Column(
* name = "guest_id",
* type = "integer",
* length = 140
* )
* )
* })
*/
class myUser extends BaseUser
{
/**
* @ORM\Id()
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
答案 1 :(得分:3)
引自官方documentation,因此可能是唯一的方法。
如果您需要更改映射(例如,以适应字段 命名为遗留数据库),唯一的解决方案是编写整个 再次映射而不继承映射的映射 超类。
答案 2 :(得分:2)
我认为name
标记的field
属性不是必需的,因为它已经为attribute-override
标记指定了
试试这个
<attribute-overrides>
<attribute-override name="emailCanonical">
<field column="email_canonical" unique="false" />
</attribute-override>
</attribute-overrides>
答案 3 :(得分:1)
似乎FOSUserBundle实体未正确导入您的项目。 确保您的config.yml的“mappings”部分(“doctrine”分支)中存在FOSUserBundle
doctrine:
orm:
entity_managers:
default:
connection: default
mappings:
AcmeDemoBundle: ~
FOSUserBundle: ~
答案 4 :(得分:0)
刚才有同样的错误,我解决了它。当Doctrine在映射中找不到相关属性(属性或关系)时,它会在ClassMetadataInfo中抛出此Mappingexception。
因此,为了覆盖“emailCanonical”属性,您需要使用“attribute-overrides”和“attribute-override”(就像您一样),并在您的实体中重新定义php类属性:
<?php
...
class YourUser extends BaseUser
{
...
/**
* Email canonical
*
* @var string
*
* @ORM\Column(name="email_canonical", type="string", length=255, unique=false)
*/
protected $emailCanonical;
@EDIT:使用此解决方案会导致另一个错误。
它解决了一个关于“无效的字段覆盖命名...”的问题,但在尝试使用php app/console doctrine:schema:validate
命令验证模式时,我得到了另一个“列重复定义...”。
有什么想法吗?
答案 5 :(得分:0)
扩展BaseUser的类应该是这样的:
<?php
namespace Namespace\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* User
* @ORM\Entity
* @ORM\Table(name="user")
* @UniqueEntity(fields="email", message="your costum error message")
*
*/
class myUser extends BaseUser
{
/**
* @ORM\Id()
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}
?>
答案 6 :(得分:0)
我知道这是一个老帖子,但我找到了一个解决方案,至少它对我有用,也许对其他人有帮助。
嗯,我有同样的问题,我在fos_user上使用自定义管理器,在doctrine entity_manager自定义管理器下的声明文件config.yml中我声明了映射到FOS_userBundle,但是缺少的是告诉我们使用不同管理器的FOS_user,并添加:
fos_user:
---- db_driver:orm
---- model_manager_name:MyCustom_Manager