我正在使用Symfony2和Doctrine2,我有一个需要实现多个数组数组的对象。我想出的唯一解决方案是在我的主对象和它引用的对象之间创建一个桥对象。
所以这就是我的目标:
/**
* @ORM\Table()
*/
class MyObject
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="CollectionOfObjectX", mappedBy="parent", cascade={"all"})
**/
private $collectionsOfObjectX;
public function __construct() {
$this->collectionsOfObjectX = new ArrayCollection();
}
... (Getters and Setters)
}这将是对象和其他对象之间的桥梁
/**
* @ORM\Table()
*/
class CollectionOfObjectX
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="ObjectX", inversedBy="collectionsOfObjectX", cascade={"all"})
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
**/
private $parent;
/**
* @ORM\ManyToMany(targetEntity="MyObject", cascade={"all"})
* @ORM\JoinTable(
* joinColumns={@ORM\JoinColumn(name="local_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="foreign_id", referencedColumnName="id")}
* )
**/
private $items;
public function __construct() {
$this->items = new ArrayCollection();
}
.... (Getters and Setters)
}这将是被引用的对象
/**
* @ORM\Table()
*/
class ObjectX
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
... (Some Properties, Getters and Setters)
} 因此,当这种方法工作时,它需要为MyObject和它引用的任何其他对象之间的每个可能的关系提供一个桥接对象,这意味着有很多重复的代码。
有没有更好的方法?
发布于 2015-01-09 22:54:49
教条2并没有真正提供n-2-n抽象关系。对象A必须是一个已知的类,并且它应该引用对象B(也是一个已知的类)。
我建议尝试类似这样的操作,以解决
/**
* @ORM\Table()
*/
class MyObject
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="CollectionOfObjectXYZ", mappedBy="parent", cascade={"all"})
**/
private $collectionsOfObjectXYZ;
public function __construct() {
$this->collectionsOfObjectXYZ= new ArrayCollection();
}
... (Getters and Setters)
}请注意缺少的注释
/**
* @ORM\Table()
*/
class CollectionOfObjectXYZ
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="MyObject", inversedBy="collectionsOfObjectXYZ", cascade={"all"})
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
**/
private $parent;
private $items;
public function __construct() {
$this->items = new ArrayCollection();
}
public function addItem($item){
/** EDIT : since we store the relation in the final object (X Y Z), we don't need particular annotation here **/
$item->setCollectionOfObjectXYZ($this);
return $this;
}
.... (Getters and Setters)
}
/**
* @ORM\Table()
*/
class ObjectX
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var CollectionOfObjectXYZ
*
* @ORM\ManyToOne(target="CollectionOfObjectXYZ", cascade={"persist"})
*/
private $colletion;
... (Some Properties, Getters and Setters)
}
/**
* @ORM\Table()
*/
class ObjectY
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var CollectionOfObjectXYZ
*
* @ORM\ManyToOne(target="CollectionOfObjectXYZ", cascade={"persist"})
*/
private $colletion;
... (Some Properties, Getters and Setters)
} 如果有帮助,请告诉我。
https://stackoverflow.com/questions/27861133
复制相似问题