【问题标题】:Undefined index: inverseJoinColumns while trying to define ManyToMany relationship between two entities未定义的索引:inverseJoinColumns 在尝试定义两个实体之间的多对多关系时
【发布时间】:2014-03-12 13:06:10
【问题描述】:

我有两个实体:用户和公司,它们之间的关系是 n:m。在我的User.php 实体中,我有这个代码:

/**
 * @ORM\ManyToMany(targetEntity="PL\CompanyBundle\Entity\Company", mappedBy="users", cascade={"all"})
 */
protected $companies;

public function __construct() {
    $this->companies = new \Doctrine\Common\Collections\ArrayCollection();
}

public function setCompanies(\PL\CompanyBundle\Entity\Company $companies) {
    $this->companies = $companies;
}

public function getCompanies() {
    return $this->companies;
}

在我的Company.php 实体中,我还有其他代码:

/**
 * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", mappedBy="companies")
 */
protected $users;

public function __construct() {
    $this->users = new \Doctrine\Common\Collections\ArrayCollection();
}

但是我收到了这个错误:

ContextErrorException:注意:未定义的索引:inverseJoinColumns /var/www/html/apps/portal_de_logistica/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php 第 1041 行

映射有什么问题?

编辑重构代码

按照@ahmed-siouani 的指示,我进行了以下更改:

User.php

/**
 * @ORM\ManyToMany(targetEntity="PL\CompanyBundle\Entity\Company", inversedBy="users")
 * @ORM\JoinTable(name="fos_user_user_has_company",
 *      JoinColumns={@ORM\JoinColumn(name="fos_user_user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
 * )
 */
protected $companies;

其中fos_user_user_has_company 是为n:m 关系添加的表。

Company.php

/**
 * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", mappedBy="companies")
 */
protected $users;

现在错误是:

AnnotationException: [创建错误] 注解@ORM\JoinTable 财产申报 Application\Sonata\UserBundle\Entity\User::$companies 没有 名为“JoinColumns”的属性。可用属性:名称、模式、 joinColumns, inverseJoinColumns

有吗?

【问题讨论】:

    标签: symfony orm doctrine-orm mapping


    【解决方案1】:

    在定义joinTable 时,您可能需要指定joinColumnsinverseJoinColumns。对于双向多对多的定义是这样的,

    class User
    {
        // ...
    
        /**
         * Bidirectional - Many users have Many companies (OWNING SIDE)
         *
         * @ManyToMany(targetEntity="Company", inversedBy="users")
         * @JoinTable(name="users_companies",
         *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
         *     inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
         * )
         **/
        private $companies;
    
        public function __construct() {
            $this->companies = new \Doctrine\Common\Collections\ArrayCollection();
        }
    
        // ...
    }
    

    虽然您的 Company 类应定义如下,

    class Company
    {
        // ...
    
        /**
         * Bidirectional (INVERSE SIDE)
         *
         * @ManyToMany(targetEntity="User", mappedBy="companies")
         */
        private $users;
    

    【讨论】:

      【解决方案2】:

      除了@Ahmed 解决方案之外,还要处理错别字,因为我犯了一个错误,为此我遇到了第二个错误。看我的注释说:

      /**
       * @ORM\ManyToMany(targetEntity="PL\CompanyBundle\Entity\Company", inversedBy="users")
       * @ORM\JoinTable(name="fos_user_user_has_company",
       *      JoinColumns={@ORM\JoinColumn(name="fos_user_user_id", referencedColumnName="id")},
       *      inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
       * )
       */
      protected $companies;
      

      但正确的是:

      /**
       * @ORM\ManyToMany(targetEntity="PL\CompanyBundle\Entity\Company", inversedBy="users")
       * @ORM\JoinTable(name="fos_user_user_has_company",
       *      joinColumns={@ORM\JoinColumn(name="fos_user_user_id", referencedColumnName="id")},
       *      inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
       * )
       */
      protected $companies;
      

      不同之处在于这一行:

      joinColumns={@ORM\JoinColumn(name="fos_user_user_id", referencedColumnName="id")},
      

      【讨论】:

        【解决方案3】:

        我的错是 ManyToMany 的两边都用 mappedBy 定义了,但只有一面应该使用 mappedBy,而另一边应该使用 inversedBy(这通常在控制集合的主实体中定义)。

        【讨论】:

        • 只是为了补充一点,我有一侧映射 m:1 和一侧 m:m 这导致了我的问题。谢谢@Tobias
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多