2016-11-05 28 views
1

私は新人です.Symfony Doctrineに新人です。結合エンティティに関する助けが必要です。主キーではないreferencedColumnNameで列を結合する - id

通常の列これはokです

/** 
* User 
* 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository") 
* UniqueEntity("email", message="Account with email already exists.") 
*/ 
class User implements AdvancedUserInterface, \Serializable 
{ 
/** 
    * @var \MainBundle\Entity\PersonDetails 
    * 
    * @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="person_details_id", referencedColumnName="id", nullable=true) 
    * }) 
    */ 
private $personDetails = null; 

主キーのIDで参加しています。

しかし、問題は、私は、ユーザーエンティティ

/** 
* User 
* 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository") 
* UniqueEntity("email", message="Account with email already exists.") 
*/ 
class User implements AdvancedUserInterface, \Serializable 
{ 
/** 
    * @var \MainBundle\Entity\PersonDetails 
    * 
    * @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person") 
    * @ORM\JoinColumns({ 
  • @ORM \ JoinColumn(名前は= "ID"、referencedColumnNameとは= "のuser_id" のidフィールドでOneToOneの関係で2つの列を参加したいということです私はこのように列を参加しようとすると、
nullable=true) 
     * }) 
     */ 
    private $personDetails = null; 

私はエラーを取得する

MainBundle \エンティティの\ PersonDetailsに主キーidの値がありません

それはID以外のインデックス、他のフィールドすることが可能であるか、私がやろうとすることは不可能でしょうか?

ありがとうございます。

+0

正しいインデントであなたの質問にコードを修正してください、それはほとんど読みやすいです。 'User'エンティティの** idフィールド**と** primary id **の違いは何ですか?あなたの質問に答えるために必要な不足しているプロパティ(つまり、@ORM \ Id()があるプロパティ)があるようです。 – nifr

答えて

1

@JoinColumn宣言で参照される列名とフィールド名が混在しています。

@JoinColumn(name="id", referencedColumnName="user_id") 

DoctrineがUserエンティティのuser_idというフィールド/プロパティを探しますこの方法です。私はあなたがuser_idUserエンティティのidのエントリであることをジョインテーブルの列にしたいと思います。

UserDetail

/** 
* @ORM\Entity 
*/ 
class UserDetail 
{ 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="User", 
    * inversedBy="details" 
    *) 
    * @ORM\JoinColumn(
    * name="user_id", 
    * referencedColumnName="id" 
    *) 
    */ 
    protected $user; 

    public function setUser(User $user) 
    { 
     $this->user = $user; 

     return $this; 
    } 

    /** @ORM\Column() */ 
    protected $key; 

    /** @ORM\Column() */ 
    protected $value; 

    public function __construct($key, $value) 
    { 
     $this->key = $key; 
     $this->value = $value; 
    } 

ユーザーあなたは、このようなあなたのUserにディテールを追加し、その後フラッシュ/続けば今

class User 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="UserDetail", 
    * mappedBy="user", 
    * cascade={ 
    *  "persist", 
    *  "remove", 
    *  "merge" 
    * }, 
    * orphanRemoval=true 
    *) 
    */ 
    protected $details; 

    public function __construct() 
    { 
     $this->details = new ArrayCollection(); 
    } 

    public function addDetail(UserDetail $detail) 
    { 
     $detail->setUser($this); 
     $this->details->add($detail); 

     return $this; 
    } 

$user->addDetail(new UserDetail('Height', '173cm')); 

これは、このようになりますuser_detailテーブルに参加-columになります:

| key   | value  | user_id | 
|---------------|-----------|---------| 
| Height  | 173cm  | 1  | 
関連する問題