2016-12-20 2 views
1

У меня проблема с Doctrine 2 & Symfony.Отношение доктрины между объектами на основе значения поля

У меня есть объект User и три объекта Example1, Example2, Example3 Я хочу связать.

Я хотел бы определить many2one соотношение между User и один из этих трех классов Example1, Example2, Example3, основываясь на значении $relation_type и $parent в User.

Я думал определить абстрактный класс Player так Example1, Example2, Example3 может проходить от него, но я не знаю, как идти на ...

Любые предложения?

class User 
{ 
    /* ... */ 
    private $relation_type; 

    /** 
    * @var \AppBundle\Entity\Player 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Player") 
    * @ORM\JoinColumn(name="parent", referencedColumnName="id") 
    */ 
    private $parent; 

} 

class Player 
{ 

} 

class Example1 extends Player 
{ 

} 

ответ

0

Если Player это абстрактный класс, то вы можете пометить его как отображенный суперкласс с @MappedSuperClass аннотацию.
Проверьте также the Doctrine2 documentation chapter 6.1. Mapped SuperClasses для более подробной информации.

<?php 
/** @MappedSuperclass */ 
class Player 
{ 
    //common properties 
} 

И теперь вы можете продлить Player в подклассе:

<?php 
/** @Entity */ 
class Example1 extends Player 
{ 
    //example1 specific properties. 
} 

Использование отображенные суперклассы поставляется с его ограничениями. Внимательно прочитайте документацию, чтобы понять, что возможно, а что нет.

0

Возможно, вы ищете STI, который в основном представляет собой реализацию для полиморфных данных.

Если я правильно понял ваш потребительский случае я бы рекомендовал следующий Структура

users[id, ..] 
| 1-2-M 
players[id, type, user_id, ..] 

(* Вы можете пойти дальше и создать +1 таблицы для каждого из примеров для хранения конкретных данных)

В Doctrine/Symfony что бы перевести в

<?PHP 
/** 
* @ORM\Entity() 
* @ORM\Table(name="users") 
*/ 
class User { 
} 

-

<?PHP 
/** 
* @ORM\MappedSuperclass 
* @ORM\Entity 
* @ORM\Table(name="players") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
* @ORM\DiscriminatorMap({ 
*  "Example1" = "AppBundle\Entity\Players\Example1", 
*  "Example2" = "AppBundle\Entity\Players\Example2", 
*  "Example3" = "AppBundle\Entity\Players\Example3", 
*  "undefined" = "Player" 
* }) 
*/ 
abstract class Player 
{ 

/** 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\Column(type="integer", options={"unsigned"=true}) 
*/ 
protected $id; 

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="profiles", fetch="EAGER") 
* @ORM\JoinColumn(nullable=false) 
*/ 
protected $user; 
} 

-

/** 
* @ORM\Entity 
*/ 
class Example1 extends Player implements PlayerInterface 
{ 
} 
+0

Спасибо за ваше предложение, Cristian, но как насчет ** Class Table Inheritance **? –

+0

CTI мог бы выполнить эту работу, а также из того, что я могу сказать по спецификациям. Моя рекомендация была основана только на предыдущем опыте работы с ИППП. Догадываюсь, что до тех пор, пока вы используете полиморфную таблицу, у вас есть более чем один способ реализовать решение. –

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

  • Нет связанных вопросов^_^