Undefined index: inverseJoinColumns when trying to define ManyToMany relationships between two objects

I have two objects: User and Company, as well as the relationship between them: n: m. In my organization User.php, I have this code:

/**
 * @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;
}

And in my object Company.php, I have this other code:

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

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

But I got this error:

ContextErrorException: Note: Undefined index: inverseJoinColumns in / var / www / html / apps / portal _de_logistica / vendor / doctrine / orm / lib / Doctrine / ORM / Persisters / BasicEntityPersister.php line 1041

What is wrong with mapping?

EDIT Refractor Code

Following the instructions from @ ahmed-siouani, I made the following changes:

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;

where fos_user_user_has_companyis the table added for the relationship n:m.

Company.php

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

And now the error:

AnnotationException: [ ] @ORM\JoinTable \Sonata\UserBundle\Entity\User:: $ "JoinColumns". : , , joinColumns, inverseJoinColumns

?

+3
3

joinColumns inverseJoinColumns joinTable. "--" - :

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;
+3

, ManyToMany mappedBy, mappedBy, inversedBy ( , ).

+3

In addition to @Ahmed's solution, take care of typos as I did one and got a second error for this. See My annotation:

/**
 * @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;

But the correct one:

/**
 * @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;

Differences in this line:

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

All Articles