2016-11-05 31 views
1

我是Symfony Doctrine中的新手,需要一些有關Join實體的幫助。通過不是主鍵的referencedColumnName加入列 - 編號

通常柱是由主密鑰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(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(name = 「ID」 的加盟關係OneToOne兩列,referencedColumnName = 「USER_ID」 ,
nullable=true) 
     * }) 
     */ 
    private $personDetails = null; 

當我嘗試加入這一方式列,我得到錯誤

上缺少MainBundle \實體\ PersonDetails主鍵ID值

是否有可能比ID索引其他領域或什麼,我試圖做是不可能的?

謝謝你們。

+0

請修復與正確的縮進你的問題的代碼,它幾乎沒有可讀性。用戶實體中的** id字段**和** primary id **之間有什麼不同?似乎有屬性丟失(即與'@ORM \ Id()')屬性...這是需要回答你的問題。 – nifr

回答

1

您已經混淆了您的@JoinColumn聲明中應引用的列名和字段名稱。

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

這樣主義查找您User實體命名user_id字段/屬性。我想你想要連接表中的列名爲user_id,而User實體的條目是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; 
    } 

用戶

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這樣,堅持/沖洗算賬:

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

這將導致在user_detail表看起來像這樣的聯接 - 科拉姆:

| key   | value  | user_id | 
|---------------|-----------|---------| 
| Height  | 173cm  | 1  |