Доктрина Отношения на табличном пространстве - PullRequest
2 голосов
/ 02 декабря 2011

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

4 голосов
/ 30 декабря 2011

Вам необходимо использовать подклассы Doctrine.Создайте подкласс для каждого пространства имен.Это позволит вам ссылаться на определенный набор данных по имени класса.

  • класс Models_Price
    • подкласс Models_Price_CD
    • подкласс Models_Price_DVD
    • подкласс Models_Price_Vinyl

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...