【问题标题】:Doctrine 2 - How to design an Entity having subtree type attribute from main tree type EntityDoctrine 2 - 如何从主树类型实体设计具有子树类型属性的实体
【发布时间】:2013-03-27 23:04:48
【问题描述】:

我有一个主实体段,它有一对多的类别,而类别有一对多的项目,所以是 3 级树结构

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)
) 

Segment数据结构示例(数字代表ID):

  1. seg1
    1. cat1
      1. 项目1
      2. 项目2
      3. 项目3
    2. cat2
      1. 项目4
      2. 项目5
  2. seg2
    1. cat3
      1. 项目6
    2. cat4
      1. 项目7
      2. 项目8

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

  1. seg1
    1. cat1
      1. 项目2
      2. 项目3
    2. cat2
      1. 项目5
  2. seg2
    1. cat4
      1. 项目8

所以我只会在 company_segment_linker 表中存储公司 fk_id 和项目 fk_ids
company_id | item_id
1 | 2
1 | 3
1 | 5
1 | 8
因为从项目表我可以参考类别和从类别表到段。

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

【问题讨论】:

    标签: doctrine-orm tree-structure


    【解决方案1】:

    对于您的 Category 类,您可以像这样使用 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();
    

    【讨论】:

    • 这是我获取类别和 sus-categories 的方式,它在我的一个模块中完成了这项工作。我希望这对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2020-01-27
    • 2022-12-23
    相关资源
    最近更新 更多