Доктрина Отношения на таблице пространств имен

У меня есть несколько моделей доктрины, которые имеют отношение к другим моделям. Давайте назовем тех 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, увидев подкласс, автоматически выберет пространство имен для всех запросов, которые вы выполняете для этой таблицы.

Другие вопросы по тегам