首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则2-如何从主树类型实体设计具有子树类型属性的实体

原则2-如何从主树类型实体设计具有子树类型属性的实体
EN

Stack Overflow用户
提问于 2013-03-27 23:04:48
回答 1查看 228关注 0票数 2

我有一个主实体段,它有一对多的类别,类别有一对多的项,所以三级树结构。

代码语言:javascript
复制
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表

代码语言:javascript
复制
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)
)

这是我的实体公司,它有来自分部的细分

代码语言:javascript
复制
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表。

代码语言:javascript
复制
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. seg1
    1. cat1
      1. item1
      2. item2
      3. item3

代码语言:javascript
复制
1. cat2 
    1. item4
    2. item5

  1. seg2
    1. cat3
      1. item6

代码语言:javascript
复制
1. cat4 
    1. item7
    2. item8

com1公司拥有这样的细分市场:

  1. seg1
    1. cat1
      1. item2
      2. item3

代码语言:javascript
复制
1. cat2 
    1. item5

  1. seg2
    1. cat4
      1. item8

因此,我只将公司fk_id和项目fk_ids存储在company_segment_linker表中。

company_id x- item_id

1/2

1/3

1/5

1/2-8

因为在item表中,我可以引用类别,也可以从类别表到段。

我的问题是,这在Doctrine2中是可能的吗,只从项外键创建子段,如果是,如何编写注释?或者我必须用另一种方法来实现这一点?谢谢你的帮助。PS:对不起我的英语:/

EN

回答 1

Stack Overflow用户

发布于 2013-10-20 15:42:50

对于分类类,可以使用OneToMony自引用关联,如下所示:

代码语言:javascript
复制
/**
 * 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获得您的树:

代码语言:javascript
复制
 $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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15671251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档