14

我在覆盖实体时遇到问题。我需要该字段emailCanonical不是唯一的。

这是我所做的:根据 Doctrine2 文档,在我UserBundle\Resources\config\doctrine\User.orm.xml添加了以下配置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 映射中删除覆盖设置,一切正常。

4

7 回答 7

13

您可以像这样使用 PHP 注释进行覆盖(从 2.3 版及更高版本的教义开始支持,请注意,在文档中它提到您不能覆盖类型,但是我当时能够使用最新版本的教义来做到这一点写它是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;
}

这在文档中指定:http: //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#overrides

于 2014-08-30T13:24:48.083 回答
3

引用官方文档,所以可能是唯一的方法。

如果您需要更改映射(例如将字段名称调整为旧数据库),唯一的解决方案是再次编写整个映射,而不从映射的超类继承映射。

于 2013-08-01T15:31:24.647 回答
3

我相信标签的name属性field不是必需的,因为它已经为attribute-override标签指定了

尝试这个

<attribute-overrides>
    <attribute-override name="emailCanonical">
        <field column="email_canonical" unique="false" />
    </attribute-override>
</attribute-overrides>
于 2013-03-21T11:01:03.293 回答
1

It seems that FOSUserBundle entities aren't imported correctly into your project. Make sure FOSUserBundle is present in "mappings" section ("doctrine" branch) of your config.yml

doctrine:
    orm:
        entity_managers:
            default:
                connection:       default
                mappings:
                    AcmeDemoBundle: ~
                    FOSUserBundle: ~
于 2013-07-19T06:52:19.373 回答
0

我知道这是一篇旧帖子,但我找到了一个解决方案,至少它对我有用,也许对其他人有帮助。

好吧,我遇到了同样的问题,我正在为 fos_user 使用自定义管理器,在声明文件 config.yml 中的学说 entity_manager 自定义管理器下我声明了到 FOS_userBundle 的映射,但是缺少的是告诉 FOS_user 我们使用不同的经理,这是通过添加:

fos_user:
---- db_driver: orm
---- model_manager_name: MyCustom_Manager

于 2015-04-29T09:17:26.840 回答
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它解决了关于“无效的字段覆盖命名...”的问题,但是当我尝试使用命令验证架构时,我得到了另一个“列的重复定义...” 。

任何想法 ?

于 2013-12-04T09:15:38.970 回答
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;
}

?>
于 2013-12-05T00:31:56.500 回答