DQL语句为多对多关系

时间:2010-08-13 22:09:26

标签: orm symfony1 doctrine dql

我对DQL如何工作感到困惑,并且在这里真的需要一些帮助。

我有三个表,称为“Band”,“Agent”和“BandAgent”。

BandAgent是多对多关系的中间表,包含agent_id和band_id。

如何使用DQL语句检索与特定band_id相关的所有代理?


修改

此代码有效,但我不知道这是否是正确的方法。 Echos屏幕上所有与BandID Band相关的相关代理:

//$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

我最后读了很多关于Doctrine的内容,最后离开了Magic Finders。以下代码是我最终为多对多问题所做的事情,如果有人有兴趣的话:

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 个答案:

答案 0 :(得分:3)

Doctrine提供Magic Finders

$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']);