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 アノテーションを使用してオーバーライドします (これは doctrine バージョン 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

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 に答える
3

公式ドキュメントからの引用なので、それが唯一の方法かもしれません。

マッピングを変更する必要がある場合 (たとえば、フィールド名をレガシー データベースに適合させるため)、唯一の解決策は、マッピングされたスーパークラスからマッピングを継承せずに、マッピング全体を再度記述することです。

于 2013-08-01T15:31:24.647 に答える
1

FOSUserBundle エンティティがプロジェクトに正しくインポートされていないようです。config.yml の「mappings」セクション (「doctrine」ブランチ) に FOSUserBundle が存在することを確認してください。

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

これは古い投稿であることは知っていますが、解決策を見つけました。少なくとも私にとってはうまくいきました。他の人にとっては役立つかもしれません。

さて、私は同じ問題を抱えていて、fos_user にカスタム マネージャーを使用しています。doctrine entity_manager カスタム マネージャーの下の宣言ファイル config.yml で、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 に答える