У меня есть основной сегмент сущности, в котором есть категории «один ко многим», а в категории есть элементы «один ко многим», поэтому трехуровневая древовидная структура
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)
)
Пример структуры данных сегмента (числа представляют собой идентификаторы):
- seg1
- cat1
- item1
- item2
- item3
- cat2
- item4
- item5
- cat1
- seg2
- cat3
- item6
- cat4
- item7
- item8
- cat3
Компания com1, у которой есть подобный подсегмент:
- seg1
- cat1
- item2
- item3
- cat2
- item5
- cat1
- seg2
- cat4
- item8
- cat4
Поэтому я бы сохранил только fk_id компании и fk_ids элемента в таблице company_segment_linker
company_id | item_id
1 | 2
1 | 3
1 | 5
1 | 8
потому что из таблицы элементов я могу ссылаться на категорию и из таблицы категорий в сегмент.
Мой вопрос: все ли это возможно в Doctrine2, чтобы создать подсегмент только из внешнего ключа (ов) элемента, и если да, то как написать аннотацию (и)? Или я должен использовать другой подход для этого? Спасибо за вашу помощь. PS: Извините за мой английский: /