我有一个主实体段,它有一对多的类别,类别有一对多的项,所以三级树结构。
class Segment
{
/**
* @ORM\Id
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="segment")
* @ORM\JoinColumn(name="segment_id", referencedColumnName="id")
*/
protected $categories;
}
class Category
{
/**
* @ORM\Id
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Segment")
* @ORM\JoinColumn(name="segment_id", referencedColumnName="id")
*/
protected $segment;
/**
* @ORM\OneToMany(targetEntity="Item", mappedBy="category")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $items;
}
class Item
{
/**
* @ORM\Id
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;
}SQL表
CREATE TABLE segment (
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
name VARCHAR(100) NOT NULL,
)
CREATE TABLE segment_category
(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
segment_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
FOREIGN KEY(segment_id) REFERENCES segment(id)
)
CREATE TABLE segment_item
(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
category_id INT NOT NULL,
name VARCHAR(100) NOT NULL,
FOREIGN KEY(category_id) REFERENCES segment_category(id)
)这是我的实体公司,它有来自分部的细分
class Company
{
/**
* @ORM\Id
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Segment")
* -- What here to add? Is this correct ?--
* @ORM\JoinTable(name="company_segment_linker",
* joinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}
* )
*/
protected $segments;
}确定哪些区段(也包括类别和项)属于公司的公司SQL表。
CREATE TABLE company_segment_linker
(
company_id INT NOT NULL,
item_id INT NOT NULL,
FOREIGN KEY(company_id) REFERENCES company(id),
FOREIGN KEY(item_id) REFERENCES segment_item(id)
) 段数据结构示例(数字表示ID):
1. cat2
1. item4
2. item5
1. cat4
1. item7
2. item8
com1公司拥有这样的细分市场:
1. cat2
1. item5
因此,我只将公司fk_id和项目fk_ids存储在company_segment_linker表中。
company_id x- item_id
1/2
1/3
1/5
1/2-8
因为在item表中,我可以引用类别,也可以从类别表到段。
我的问题是,这在Doctrine2中是可能的吗,只从项外键创建子段,如果是,如何编写注释?或者我必须用另一种方法来实现这一点?谢谢你的帮助。PS:对不起我的英语:/
发布于 2013-10-20 15:42:50
对于分类类,可以使用OneToMony自引用关联,如下所示:
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="Category\Entity\Repository\CategoryRepository")
*/
class Category
{
/**
* @var Integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
*@var String
*@ORM\Column(name="cat_name", type="string", length=60, nullable=false)
*
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="Category\Entity\Category", mappedBy="parent")
**/
private $children;
/**
* @ORM\ManyToOne(targetEntity="Category\Entity\Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", unique=false, nullable=true)
**/
private $parent;
public function __construct() {
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}这将为您创建一个表,然后通过这个DQL获得您的树:
$ql="SELECT ca.name, c.name AS child_name FROM Category\Entity\Category ca LEFT JOIN ca.children c WHERE ca.parent IS NULL";
$query = $em->createQuery($ql);
$categories = $query->getResult();https://stackoverflow.com/questions/15671251
复制相似问题