2016-04-01 18 views
0

sonraki varlık vardır: müşteri hesaplarını çarpın sahip olduğunuDoktrini 2 ManyToOne multipy JoinColumns

/** 
* Customer 
* 
* @ORM\Table(name="customer") 
* @ORM\Entity() 
*/ 
class Customer 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var Account[]|ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Account", mappedBy="customer") 
    */ 
    private $accounts; 

    /** 
    * @var Account 
    * 
    * @ORM\OneToOne(targetEntity="Account") 
    * 
    * @ORM\JoinColumns({ 
    *  @ORM\JoinColumn(name="id",referencedColumnName="customer_id"), 
    *  @ORM\JoinColumn(name="default_account_id", referencedColumnName="id") 
    * }) 
    */ 
    private $defaultAccount; 
} 


/** 
* Account 
* 
* @ORM\Table(name="account") 
*/ 
class Account 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @var Customer 
    * 
    * @ORM\ManyToOne(targetEntity="Customer", inversedBy="accounts") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    private $customer; 
} 

Fikir, hesabın onr müşteri için varsayılan olmalıdır. O varsayılan müşteri hesabı bu müşteriye aittir sağlamak için çarpın alanları ile yabancı anahtar kullanmak istiyorum, ama gelecek hatayı alıyorum:,

Column name `customer_id` referenced for relation from MyBundle\Entity\Customer towards MyBundle\Entity\Account does not exist. 

Aslında ORM düzeyinde hayır "customer_id" alan vardır bunun nedeni "customer.id" dir ama nasıl referans göstereceğimi bilmiyorum.

cevap

0

@ORM\JoinColumn(name="id",referencedColumnName="customer_id"), satırı gereksiz görünüyor. Aşağıdaki şekilde bu alanı yapılandırmak için deneyin: Bu arada

/** 
* @var Account 
* 
* @ORM\OneToOne(targetEntity="Account") 
* 
* @ORM\JoinColumn(name="default_account_id", referencedColumnName="id") 
*/ 
private $defaultAccount; 

, Sadece senin Account varlık olarak bir boolean sütun is_default eklendi eğer daha iyi olacağını düşünüyorum.

+0

Yalnızca bir yabancı anahtar kullanırsam varsayılan hesabın başka müşterilerden gelme olasılığı vardır. Dolayısıyla, varsayılan hesabın veritabanı düzeyindeki mevcut müşteriye ait olduğundan emin olmak için iki alanlı yabancı anahtar eklemek daha iyidir. –

+0

Bu durumda, iki yönlü bire bir ilişki gerekir. –

+0

SQL sözcüklerinde ihtiyacım var: ALTER TABLE public.customer ADD CONSTRAINT fk_1 YABANCI ANAHTARI (default_account_id, id) REFERANSLAR public.account (id, customer_id) –