Search code examples
doctrine-ormdoctrinesymfony-2.8

Invalid mapping for a one-to-one relation


I'm trying to create a One-to-one bidirectional mapping between two Entitiesbut what I get is this error:

# app/console doctrine:schema:validate --env=dev_local

[Mapping]  FAIL - The entity-class 'Belka\AuthBundle\Entity\Globaltoken' mapping is invalid:
* The association Belka\AuthBundle\Entity\Globaltoken#user refers to the inverse side field Belka\AuthBundle\Entity\User#globaltoken which does not exist.

[Mapping]  FAIL - The entity-class 'Belka\AuthBundle\Entity\User' mapping is invalid:
* The mappings Belka\AuthBundle\Entity\User#globalToken and Belka\AuthBundle\Entity\Globaltoken#user are inconsistent with each other.

These are my entities:

User entity

/**
 * @ORM\Entity
 * @ORM\Table(name="app_auth.""User""", schema="app_auth")
 * @ORM\Entity(repositoryClass="UserRepository")
 * @UniqueEntity("username", groups={"strict"})
 * @UniqueEntity("email", groups={"strict"})
 * @Assert\GroupSequence({"User", "strict"})
 */
class User implements EncoderAwareInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message = "user.username.not_blank")
     * @ORM\GeneratedValue(strategy="NONE")
     * @Serializer\Groups({"default"})
     */
    private $username;

    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message = "user.email.not_blank")
     * @Assert\Email(message = "user.email.not_valid")
     * @Serializer\Groups({"default"})
     */
    private $email;

    /**
     * @ORM\Column(type="string", nullable=true)
     * @Serializer\Groups("personal")
     */
    private $password;

    /**
     * @ORM\Column(type="string")
     * @Serializer\Groups({"default"})
     */
    private $name;

    /**
     * @ORM\Column(type="string")
     * @Serializer\Groups({"default"})
     */
    private $surname;

    /**
     * @ORM\Column(type="string", length=5)
     * @Serializer\Groups({"default"})
     */
    private $lang;

    /**
     * @ORM\Column(type="boolean")
     * @Serializer\Groups({"strict_adm"})
     */
    private $deleted = false;

    /**
     * @ORM\OneToOne(targetEntity="Globaltoken", mappedBy="user", cascade={"persist"})
     * @Serializer\Groups({"strict"})
     */
    private $globalToken;

    <removed methods>
    }

Globaltoken entity

/**
 * @ORM\Entity
 * @ORM\Table(name="app_auth.""Globaltoken""", schema="app_auth")
 * @ORM\Entity(repositoryClass="GlobaltokenRepository")
 * @UniqueEntity("token", groups={"strict"})
 * @UniqueEntity("last_use", groups={"strict"})
 * @Assert\GroupSequence({"Globaltoken", "default", "strict"})
 * @ORM\HasLifecycleCallbacks()
 */
class Globaltoken
{
    //10 minutes, expressed in seconds
    const VALIDITYINTERVAL = 600;

    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     * @ORM\GeneratedValue(strategy="NONE")
     * @Serializer\Groups({"strict"})
     */
    private $token;

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="globaltoken")
     * @ORM\JoinColumns({
     *       @ORM\JoinColumn(name="owned_by_username", referencedColumnName="username"),
     *       @ORM\JoinColumn(name="owned_by_email", referencedColumnName="email")
     * })
     * @Serializer\Groups({"strict"})
     */
    private $user;

    /**
     * @ORM\Column(type="datetime")
     * @Assert\NotBlank()
     * @Serializer\Groups({"strict"})
     */
    private $last_use;

    /**
     * @Serializer\Groups({"default"})
     */
    private $expiring;

    <removed methods>
    }

what do you think it could be?


Solution

  • Got it. The uppercase-typo is the responsible of everything:

    User::globalToken is NOT what inversedBy="globaltoken" expects. User::globaltoken is.

    I fell into one of the most classic pitfalls in IT development I'd say that could drive yourself into distraction. I'm quite disappointed by the PHPStorm's support about Symfony annotations though.