与学说映射学说 2 的关联失败

Posted

技术标签:

【中文标题】与学说映射学说 2 的关联失败【英文标题】:Association fail with doctrine mapping Doctrine 2 【发布时间】:2013-04-16 12:43:44 【问题描述】:

我在学说 2 中遇到以下问题,我想将我的地址实体和国家实体加入我的用户实体。所以经过一些尝试它在数据库中工作正常,但是当我使用./vendor/bin/doctrine-module orm:validate-schema 它向我展示了一些映射失败。

[Mapping]  FAIL - The entity-class 'User\Entity\Adress' mapping is invalid:
* The association User\Entity\Adress#user refers to the inverse side field User\Entity\User#use
r_id which does not exist.
* The association User\Entity\Adress#country refers to the inverse side field User\Entity\Count
ry#id which is not defined as association.
* The association User\Entity\Adress#country refers to the inverse side field User\Entity\Count
ry#id which does not exist.

我真的不知道为什么会这样,因为我的数据库像这样工作正常。它识别地址中的用户和国家实体,以及值。

我的用户实体:

   ...
    /**
 * Entity Class representing a post of our User module.
 * 
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="User\Repository\UserRepository")
 * 
 * @property int userid
 * @property string firstname
 * @property string insertion
 * @property string lastname
 * @property date dateofbirth
 * @property string gender
 * @property string phonenumber
 * @property string mobile
 */
    class User extends zfcUser implements UserInterface
    
        /**
         * Id from user
         * 
         * @ORM\OneToMany(targetEntity="Adress", mappedBy="user", cascade= "remove")
         * @access protected
         */

        /**
         * Firstname of our user
         *
         * @ORM\Column(type="string", nullable=true)
         * @var string
         * @access protected
         */
        protected $firstname;

    ...
    ...

我的地址实体:

/**
 * Entity Class representing our Adress module.
 *
 * @ORM\Entity
 * @ORM\Table(name="adress")
 * @property integer addressid
 * @property string street
 * @property integer number
 * @property string addition
 * @property string zipcode
 * @property integer userid
 * @property integer countryid
 */
class Adress


...
...

/** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="user_id")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
     * @var User[]
     * @access protected
     */
    protected $user;

    /**
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="id")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     * @var Country[]
     * @access protected
     */
    protected $country;

...
...

我的国家实体:

   ...
    ...
    /**
 * Entity Class representing our Country module.
 *
 * @ORM\Entity
 * @ORM\Table(name="country")
 * @property integer id
 * @property string countrycode
 * @property string countryname
 */
    class Country
    
    /**
         * Id from a country
         * 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         * @ORM\OneToMany(targetEntity="Adress", mappedBy="country")
         * @var int
         * @access protected
         */
        protected $id;

    ...
    ...

有人解释为什么会这样?

【问题讨论】:

【参考方案1】:

对于第一个错误:

在您的User 类中,缺少与地址相关的属性,因此可能有两种可能性:

    如果是protected $user_id: 这是行不通的,因为 Doctrine 需要一个地址对象数组。

    如果是protected $addresses: 您必须将用户属性上 Address 类中的映射更改为:

    @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")

对于第二个错误:

在您的 Address 课程中,您必须删除国家/地区的 inversedBy 属性:

@ORM\ManyToOne(targetEntity="Country")

【讨论】:

好的,第二个问题解决了。但我的第一个错误不是。我的用户类中有一个受保护的 $user_id 。但它由 zfcUser 扩展(设置此 $user_id 的位置)。我希望我的地址中有 user_id(因为一个用户可以有多个地址)。我该如何解决这个错误? 只需在User 类$adresses 中调用你的OneToMany 属性,你也需要$user_id,但是当它在zfcUser 中并且这个类是一个映射的超类时,它应该可以工作。

以上是关于与学说映射学说 2 的关联失败的主要内容,如果未能解决你的问题,请参考以下文章

Symfony学说OneToAll关系

学说 oneToOne 单向:获取映射对象

学说 Symfony2 坚持与现有的关联实体

学说选择innerJoined实体或没有关联的实体

使用学说扩展基类,我的基类是不是有 1:n 关联

如何使用条件关联建立 ZF2 学说实体