Symfony 未定义索引:在尝试定义两个实体之间的多个关系时反向连接列

Symfony 未定义索引:在尝试定义两个实体之间的多个关系时反向连接列,symfony,orm,doctrine-orm,mapping,Symfony,Orm,Doctrine Orm,Mapping,我有两个实体:用户和公司,它们之间的关系是n:m。在我的User.php实体中,我有以下代码: /** * @ORM\ManyToMany(targetEntity="PL\CompanyBundle\Entity\Company", mappedBy="users", cascade={"all"}) */ protected $companies; public function __construct() { $this->companies = new \Doctri

我有两个实体:用户和公司,它们之间的关系是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/persister/basicintypersister.php 第1041行

映射中有什么错误

编辑重构代码

根据@ahmed siouani I的指示,进行了以下更改:

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\u user\u user\u has\u 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::$Companys没有 名为“JoinColumns”的属性。可用属性:名称、架构、, 连接列,反向连接列


任何?

在定义
连接表时,您可能需要指定
连接列
反向连接列
。对于一个双向多对多的定义是

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();
    }

    // ...
}
虽然您的公司类应定义为:

class Company
{
    // ...

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

除了@Ahmed solution,还要注意打字错误,因为我犯了一个,第二个错误就是我犯的。见我的注解说:

/**
 * @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")},

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

更进一步,我让一侧映射了m:1,另一侧映射了m:m,这导致了我的问题。谢谢你@Tobias