2016-05-09 3 views
1

Wenn ich den folgenden Befehl ausführen: php app/console doctrine:schema:update --force --dump-sqlLehre: schema: update Erstellung nicht OneToOne Beziehungen

Es Diese Nachricht zurückgibt: Nothing to update - your database is already in sync with the current entity metadata.

Ich habe zwei Entitäten, User und UserProfile.

User.php

/** 
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\OneToOne(targetEntity="UserProfile", inversedBy="user_id") 
    */ 
    private $id; 
... 

UserProfile.php

/** 
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository") 
*/ 
class UserProfile 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="user_id", type="integer") 
    * @ORM\OneToOne(targetEntity="User", mappedBy="id") 
    */ 
    private $userId; 
... 

Ich habe bereits versucht, den Cache zu löschen.

UPDATE # 1

User.php

/** 
* @ORM\Id 
* @ORM\Column(name="id", type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\OneToOne(targetEntity="UserProfile", mappedBy="userId") 
*/ 
private $id; 

UserProfile.php

/** 
* @ORM\Id 
* @ORM\Column(name="user_id", type="integer") 
* @ORM\OneToOne(targetEntity="User", inversedBy="id") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $userId; 

Antwort

0

Sie haben ein paar Optionen hier, wenn Sie einen bi wollen -direction association, was bedeutet, dass Sie in der Lage sein möchten, auf die andere Entität von jedem von ihnen zuzugreifen, dann wollen Sie eine andere Eigenschaft (NICHT die $id) verwenden, um dies zu erreichen. Etwas wie:

/** 
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO")   
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="userId") 
    */ 
    private $profile; 

    ... 
} 

Dann in UserProfile.php

/** 
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository") 
*/ 
class UserProfile 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO")   
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="profile") 
    * @ORM\JoinColumn(name="userId", referencedColumnName="id") 
    */ 
    private $user; 

    ... 
} 

Dies ermöglicht es Ihnen $userProfile->getUser() und auch $user->getProfile() zu tun.

Wenn Sie die userId als Primärschlüssel für die UserProfile-Tabelle verwenden möchten, können Sie nur mehr Arbeit dafür aufwenden, und Sie müssen sie explizit in Ihrer Anwendung festlegen. Einfacher, um es auf einem anderen Feld zu referenzieren.

unidirektional

User.php

/** 
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO")   
    */ 
    private $id; 

    ... 
} 

UserProfile.php

/** 
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository") 
*/ 
class UserProfile 
{ 

    /** 
    * @ORM\OneToOne(targetEntity="User", inversedBy="profile") 
    * @ORM\JoinColumn(name="userId", referencedColumnName="id") 
    */ 
    private $user; 

    ... 
} 

Dies wird Ihnen nur erlauben $userProfile->getUser() zu tun. Wahrscheinlich nicht das, wonach du suchst.Die andere unidirektionale Lösung ist von dem Benutzerobjekt auf die Userprofile, wie folgt aus:

/** 
* @ORM\Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO")   
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="id") 
    */ 
    private $profile; 

    ... 
} 

Dann in UserProfile.php

/** 
* @ORM\Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"}) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserProfileRepository") 
*/ 
class UserProfile 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO")   
    */ 
    private $id; 

    ... 
} 

Auf diese Weise können $user->getProfile() tun können.

+0

Während ich verstehe, warum es notwendig und empfohlen ist, stört es mich, dass ich 2 zusätzliche Eigenschaften und 1 zusätzliches Feld brauche. Es wird in beiden Tabellen genau dieselben Zeilen geben, und die user_profile_id wird die selbe wie die user_id sein (es sei denn, etwas geht schrecklich schief). Wie auch immer, deine Antwort hat mein Problem gelöst, danke! – RektByAyyLMAO

+0

Sie können damit nur mit der einen Spalte tun, es ist nur eine Menge zusätzliche Arbeit, die für mich einfach ist, die zusätzliche Eigenschaft hinzuzufügen. Aber ich fühle deine Frustration. Froh, dass die Antwort hilfreich war. – Chausser

+0

Bei dieser letzten Option haben Sie für die Eigenschaft '$ profile' 'mappedBy =" userId "' geschrieben, aber es gibt keine 'userId'. – RektByAyyLMAO

0

inversedBy bezieht sich auf die Eigenschaft, nicht das Datenbankfeld.

ändern inversedBy="user_id" zu inversedBy="userId"

Sie auch JoinColumn verwenden sollten, nicht Spalte, und referencedColumnName gemäß der Dokumentation:

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-unidirectional

+0

Es funktioniert immer noch nicht, es scheint. Ich habe den Code deiner Tipps im OP aktualisiert. – RektByAyyLMAO