2

我有一个具有一对多类别的主要实体段,并且类别具有一对多项目,所以 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. 段1
    1. 猫1
      1. 项目1
      2. 项目2
      3. 第 3 项
    2. 猫2
      1. 第 4 项
      2. 项目5
  2. 段2
    1. 三类
      1. 第 6 项
    2. 第四类
      1. 第 7 项
      2. 第8项

公司 com1 的子部门如下:

  1. 段1
    1. 猫1
      1. 项目2
      2. 第 3 项
    2. 猫2
      1. 项目5
  2. 段2
    1. 第四类
      1. 第8项

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

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

4

1 回答 1

0

对于您的 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();
于 2013-10-20T15:42:50.367 回答