2014-12-27 4 views
3

У меня есть две таблицы: пользователи и контактыУчение - как установить один-к-одному отношения между двумя сущностями

Пользователи

  • идентификатор
  • имя пользователя

Контакты

  • идентификатор
  • user_id
  • электронной (я упростил структуру)

Теперь, как настроить доктрины органы должным образом?

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
*/ 
class User extends BaseEntity { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", unique=true) 
    */ 
    protected $username; 

    /** 
    * @ORM\OneToOne(targetEntity="Contact") 
    * @ORM\JoinColumn(name="id", referencedColumnName="user_id", onDelete="CASCADE") 
    **/ 
    protected $contact; 
} 

Контактное лицо:

/** 
* @ORM\Entity 
* @ORM\Table(name="contacts") 
*/ 
class Contact extends BaseEntity { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

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

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $email; 
} 

Дела в том, что я не уверен, является ли отношение объекта установлено правильно.

  1. Я не знаю, как установить, если User удаляется затем удалить Contact, но не наоборот.
  2. Если я создаю $user = new User(), а затем $contact = new Contact(), как с ними связаться? $user->contact = $contact? Будет ли после persist() и flush() правильно заполнить user_id и вставить данные в обе таблицы?
  3. Я получаю ошибку A new entity was found through the relationship '...\User#contact' that was not configured to cascade persist operations for entity: ...\[email protected] To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement '...\Contact#__toString()' to get a clue. Я застрял на этом, который, я думаю, связан с моей проблемой №1, и поэтому я не могу проверить # 2.

Я просматривал документы в течение нескольких часов, но я застрял, и я не нашел ни одного реального примера, который бы вел меня ... Может ли кто-нибудь помочь мне, показывая мне правильную конфигурацию отношений этих сущностей?

ответ

5

Для каскадных делеции пользователя поэтому его контакт также будет удален, в Contact объекта добавить onDelete="CASCADE" к JoinColumn аннотирования $user собственности (это будет только удалить контакт, если его пользователь будет удален)

/** 
* @var User 
* @ORM\OneToOne(targetEntity="User") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $user; 

Если вы сохраняете контакт, прежде чем добавлять его пользователю, вы не должны ошибаться. Если вы хотите добавить новый контакт путем непосредственного назначения нового ип-сохраненного контакта с пользователем, то вам необходимо добавить к вашей cascade={"persist", "remove"}User сущности

/** 
* @ORM\OneToOne(targetEntity="Contact",cascade={"persist", "remove"}) 
* @ORM\JoinColumn(name="id", referencedColumnName="user_id") 
**/ 
protected $contact; 
+0

Ok спасибо, что хорошо звучит. Хотя я пытался установить 'cascade = {" persist "," remove "})' и когда я делаю '$ user = new User()' '$ contact = new Contact()' '$ user-> contact = $ contact '' $ entityManager-> persist ($ user) '' $ entityManager-> flush() 'Пользователь создается, но не Contact. Что я делаю не так? – simPod

+0

Если я вручную 'persist ($ contact)' работает. Должен ли я это делать или могу ли я каким-то образом включить его в аннотации '@ ORM'? – simPod

+1

@simPod добавление 'cascade = {" persist "," remove "})' к свойству '$ contact' вашего объекта' User' должно позволить вам добавить неустановленный контакт к 'User'. есть ли у вас какие-либо другие сопоставления в «User», которые могут вызвать проблему? – FuzzyTree

Смежные вопросы