DQL оператор для многих, чтобы многие отношения - PullRequest
2 голосов
/ 14 августа 2010

Я не совсем понимаю, как работает DQL, и мне действительно нужна помощь.

У меня есть три таблицы, называемые "Band", "Agent" и "BandAgent".

BandAgent - это средняя таблица для отношения «многие ко многим», содержащая agent_id и band_id.

Как получить все агенты, связанные с конкретным band_id, с помощью оператора DQL?


РЕДАКТИРОВАТЬ

Этот код работает, но я не знаю, является ли это правильным способом сделать это.Вывод на экран всех связанных агентов, связанных с группой, по BandID:

//$band is a Band Table Row
$bandAgentTable = Doctrine_Core::getTable('BandAgent');
$agentTable = Doctrine_Core::getTable('Agent');

$bandAgentTable = $bandAgentTable->findByBandId($band->getId());
foreach ($bandAgentTable as $bandAgent) {   
    $agent = $agentTable->findById($bandAgent['agent_id']);
    echo $agent[0]['name'];
}

РЕДАКТИРОВАТЬ 2

Я прочитал чертовски много оДоктрина, и в итоге отошел от Магических Искателей.Следующий код - это то, что я в конечном итоге сделал для своей проблемы «многие ко многим», если кому-то интересно:

public function getRelatedAgents() {
$q = Doctrine_Query::create()
   ->from('Band b')
   ->leftJoin('b.Agents a')
   ->where('b.id = ?', $this->getId());
$bands = $q->fetchArray();
return $bands[0]['Agents'];
}

1 Ответ

3 голосов
/ 14 августа 2010

Doctrine предлагает Магические Искатели .

$bandAgentTable = Doctrine_Core::getTable('BandAgent');    
$bandAgentTableSearch = $bandAgentTable->findByBand($band);

Это будет искать столбец Band в таблице BandAgent и сопоставлять его с переменной $band.

Базовая схема методов поиска выглядит следующим образом: findBy%s($value) или findOneBy%s($value).%s может быть именем столбца или псевдонимом отношения.Если вы даете имя столбцу, вы должны указать значение, которое вы ищете.Если вы указываете псевдоним отношения, вы можете либо передать экземпляр класса отношения для поиска, либо указать фактическое значение первичного ключа.

Обновление: В ответ на ваши измененияВы также можете искать по двум столбцам вместе.

$agent = $bandAgentTable->findByBandIdAndId($band->getId(), $bandAgent['agent_id']);
...