2010-08-13 3 views
2

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

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

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

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


EDIT

Этот код работает, но я не знаю, если это правильный способ сделать это. Echos на экран все связанные с ним агенты, связанные с Группой по 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']; 
} 

EDIT 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']; 
} 

ответ

3

Доктрина предлагает Magic Finders.

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

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

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

Update: В ответ на ваши изменения, вы также можете найти на двух колоннах вместе.

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

Чтобы заставить его работать с Magic Finders, мне пришлось сделать два находок, чтобы связать отношения «многие-ко-многим». Я разместил свой код в своем вопросе выше, возможно, вы можете дать мне отзыв о том, что я делаю неправильно здесь. – jgallant

+0

Упс! Я неправильно прочитал ваш код. Да, так вы можете это сделать. У вас есть информация, которую вы имеете в двух таблицах, и единственный способ, которым связаны эти таблицы, - через другую третью таблицу. Следовательно, вы должны запросить все три таблицы, насколько я могу думать с пустым животом. –

+0

Это все еще возвращает строку из таблицы bandAgent, которая представляет собой таблицу соединения между Band и Agent. Мне нужно получить имя агента из таблицы Агента в качестве конечного результата. Я принимаю ваш ответ, так как вы в конечном итоге заставили меня решить мою проблему.Я просто не уверен, правильно ли я это сделал. – jgallant

Смежные вопросы