Home » Php » php – Symfony – The mappings are inconsistent with each other

php – Symfony – The mappings are inconsistent with each other

Posted by: admin July 12, 2020 Leave a comment

Questions:

I have 2 Entities, User and Follower.

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User extends BaseUser
{
    /**
     * @ORM\OneToMany(targetEntity="Follower", mappedBy="user")
     */
    protected $followers;

    /**
     * @ORM\OneToMany(targetEntity="Follower", mappedBy="follower")
     */
    protected $followings;
}


/**
 * @ORM\Entity
 * @ORM\Table(name="follows")
 */
class Follower
{        
    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="followers")
     */
    protected $user;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="followers")
     */
    protected $follower;
}

User have followers ($followers) and followings ($followings).

I’m not sure why, but my dev profiler says:

The mappings AppBundle\Entity\User#followings and
AppBundle\Entity\Follower#follower are inconsistent with each other.

The mappings AppBundle\Entity\Follower#follower and
AppBundle\Entity\User#followers are inconsistent with each other.

Why they are incosistent and it should be done?

How to&Answers:

In the Follower Entity, replace this:

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="followers")
 */
protected $follower;

with:

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="followings")
 */
protected $follower;

You can use the command doctrine:schema:validate that checks the current mapping for valid forward and reverse mappings.

php app/console doctrine:schema:validate

Hope this help

Answer:

You should replace followers by followings in :

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="followers")
 */
protected $follower;

But i think it’s better to use ManyToMany associations on User Entity. You can try something like this :

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
*/
class User extends BaseUser
{
  /**
   * @ORM\ManyToMany(targetEntity="User", mappedBy="followings")
  */
  private $followers;

  /**
   * @ORM\ManyToMany(targetEntity="User", inversedBy="followers")
   * @ORM\JoinTable(name="follows",
   *      joinColumns={@ORM\JoinColumn(name="following_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="follower_id", referencedColumnName="id")}
   *      )
  */
  private $followings;