Доктрина Отношения на таблице пространств имен
У меня есть несколько моделей доктрины, которые имеют отношение к другим моделям. Давайте назовем тех ItemsOne
, ItemsTwo
, ItemsThree
, У каждого есть отношение, определенное к Products
класс учения (таблица продуктов) и отношение определяется как:
$this->hasMany(
'Models_Products as Products',
array(
'local' => 'id',
'foreign' => 'product_id',
)
);
Ничего необычного там нет.
У меня тоже есть другая таблица (prices
) который хранит данные в пространстве имен. Под этим я подразумеваю, что в конкретной таблице хранятся данные на основе предварительно определенного ключа (т. Е. Vinyl
, CD
, DVD
) поэтому строки будут показывать что-то вроде этого:
media_namespace entity_id quantity unit_price
CD 4 1000 0.99
DVD 4 2500 1.25
CD 7 3750 0.25
Vinyl 15 75 4.25
entity_id
является идентификатором каждой из моделей, обращающихся к этой таблице. Так, например, CD/entity_id = 4
относится к ItemsOne
модель, DVD/entity_id = 4
относится к ItemsTwo
модель и т. д.
Я хочу создать отношения - и я не знаю, можно ли это сделать - тогда как в модели это будет пространство имен. Итак, в приведенном выше примере с отношениями продуктов мне нужно что-то вроде (для модели ItemsOne):
$this->hasMany(
'Models_Prices as Prices',
array(
'local' => 'id',
'foreign' => 'entity_id',
)
);
Однако все вышеперечисленное вернет все цены с entity_id
соответствие ItemsOne
таблица, которая отчасти правильна. В приведенном выше примере, если entity_id = 4
, он вернет CD
запись, но и DVD
тот, который не то, что мне нужно. Я хочу, чтобы он фильтровал данные на основе media_namespace
Таблица. Короче говоря, мне нужно:
prices.media_namespace = 'CD' AND prices.entity_id = itemsone.id
Может ли вышеизложенное отразиться на hasMany
отношения в учении? Я искал и не могу что-то, что могло бы помочь.
Любые указатели приветствуются!
1 ответ
Вам нужно использовать подклассы Doctrine. Создайте подкласс для каждого пространства имен. Это позволит вам ссылаться на определенный набор данных по имени класса.
- Класс Models_Price
- подкласс Models_Price_CD
- подкласс Models_Price_DVD
- Подкласс Модели_Цена_Винил
В классе Price вам необходимо указать следующее:
public function setUp()
{
parent::setUp();
$this->setSubclasses(
array(
'Price_CD' => array(
'media_namespace' => 'CD',
),
'Price_DVD' => array(
'media_namespace' => 'DVD',
),
'Price_Vinyl' => array(
'media_namespace' => 'Vinyl',
),
)
);
}
Давайте сделаем предположение, что ItemsOne использует пространство имен CD, ItemsTwo использует пространство имен DVD, а ItemsThree использует пространство имен Vinyl.
В этой ситуации вы добавили бы следующее отношение к каждому классу:
ItemsOne:
$this->hasMany(
'Models_Price_CD as Prices',
array(
'local' => 'id',
'foreign' => 'entity_id',
)
);
ItemsTwo:
$this->hasMany(
'Models_Price_DVD as Prices',
array(
'local' => 'id',
'foreign' => 'entity_id',
)
);
ItemsThree:
$this->hasMany(
'Models_Price_Vinyl as Prices',
array(
'local' => 'id',
'foreign' => 'entity_id',
)
);
Теперь каждое из ценовых отношений вернет только то, что вы ожидаете. Doctrine, увидев подкласс, автоматически выберет пространство имен для всех запросов, которые вы выполняете для этой таблицы.