2

1 対多のカテゴリを持つメイン エンティティ セグメントがあり、カテゴリには 1 対多の項目があるため、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;
}

Company に属するセグメント (カテゴリとアイテムも含む) を決定する Company 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. セグメント1
    1. 猫1
      1. アイテム1
      2. アイテム2
      3. アイテム3
    2. 猫2
      1. アイテム4
      2. アイテム5
  2. セグメント2
    1. 猫3
      1. item6
    2. 猫4
      1. アイテム7
      2. item8

次のようなサブセグメントを持つ会社 com1:

  1. セグメント1
    1. 猫1
      1. アイテム2
      2. アイテム3
    2. 猫2
      1. アイテム5
  2. セグメント2
    1. 猫4
      1. item8

したがって、会社の fk_id とアイテムの fk_ids のみを company_segment_linker テーブル
company_id |に保存します。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();

}

これにより、1 つのテーブルが作成され、この 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 に答える