Доктрина: многие ко многим с датой назначения в refclass - PullRequest
1 голос
/ 27 апреля 2010
residentSector:
        columns:
            id_resident_sector:
                type: integer
                primary: true
                autoincrement: true
            id_resident:
                type: integer(8)
            id:
                type: integer(8)
            date:
                type: timestamp 
residents:
        columns:
            id_resident:
                type: integer(8)
                primary: true
                autoincrement: true
            firstname:
                type: string(50)
            lastname:
                type: string(50)        
        relations:           
            Sectors:
                class: Sectors
                local: id_resident
                foreign: id
                refClass: residentSector 
Sectors:
        columns:
                id:
                     type: integer(4)
                     primary: true
                     autoincrement: true
                sector_name:
                      type: string(50)
                id_resp:
                      type: integer(4)
                visibility:
                      type: integer(1)

Я хочу выбрать всех «резидентов» данного «сектора» на заданную дату (например, последнюю дату).

Моя проблема в том, что поле даты находится в refclass (потому что это дата назначения), поэтому

-> где ('резидент.Секторы.дата = макс (резидент.Сектор.дата)')

явно не сработает, потому что refclass не является частью коллекции ..

Каков хороший способ определить отношение доктрины, чтобы я мог получить самый последний сектор на дату резидента?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

К сожалению, Doctrine не предоставляет встроенного способа достичь того, что вы пытаетесь сделать. Однако на самом деле отношение многие ко многим использует двойное отношение один ко многим.

Итак, что вам нужно, это:

  1. Сделать правильный DQL-запрос:

    Doctrine_Query::create()
    ->from('Residents r')
    ->innerJoin('r.XXX rs WITH rs.date = ?', '08-04-2010')
    ->innerJoin('r.Sector s');
    

    Где XXX - имя таблицы ResidentSector. Я не совсем уверен, будет ли его имя совпадать с именем таблицы, но вы можете получить его имя из определения таблицы, сгенерированного Doctrine.

  2. После выполнения запроса вам придется выполнить все сопоставления самостоятельно, используя Doctrine_Record::mapValue.

0 голосов
/ 30 апреля 2010

Я не знаю, как использовать доктрину, но наличие множества отношений приводит к обилию повторяющихся данных.

Возможно, вам нужно иметь 3 таблицы (резидентам, секторам, резидентам, секторам), в которых дата назначена в таблице residentToSectors, а затем получить информацию для резидента или сектора на основе данных, которые вы вставляете в предложение WHERE?

...