多对多关系的 DQL 语句
Posted
技术标签:
【中文标题】多对多关系的 DQL 语句【英文标题】:DQL statement for many to many relationship 【发布时间】:2010-08-13 22:09:26 【问题描述】:我对 DQL 的工作原理感到困惑,在这里真的需要一些帮助。
我有三个表,分别称为“Band”、“Agent”和“BandAgent”。
BandAgent 是多对多关系的中间表,包含 agent_id 和 band_id。
如何使用 DQL 语句检索与特定 band_id 相关的所有代理?
编辑
此代码有效,但我不知道它是否是正确的方法。通过 BandID 在屏幕上回显与某个 Band 相关的所有关联 Agent:
//$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】:Doctrine 提供Magic Finders.
$bandAgentTable = Doctrine_Core::getTable('BandAgent');
$bandAgentTableSearch = $bandAgentTable->findByBand($band);
这将在表BandAgent
中搜索列Band
并将其与变量$band
匹配。
查找器的基本模式 方法如下:
findBy%s($value)
或findOneBy%s($value)
。%s
可以是 列名或关系别名。如果 你给一个你必须给的列名 您正在寻找的价值。如果你 指定关系别名,您可以 要么传递一个实例 关系类来查找或给出 实际的主键值。
更新:响应您的编辑,您还可以同时搜索两列。
$agent = $bandAgentTable->findByBandIdAndId($band->getId(), $bandAgent['agent_id']);
【讨论】:
为了让它与 Magic Finders 一起工作,我必须进行两次查找才能将多对多关系连接在一起。我在上面的问题中发布了我的代码,也许你可以在这里给我反馈我做错了什么。 哎呀!我读错了你的代码。是的,你可以这样做。您有两个表中的信息,并且这两个表相关的唯一方法是通过另一个第三个表。因此,据我所知,您必须空腹查询所有三个表。 这仍然只返回bandAgent表中的一行,该表是Band和Agent之间的连接表。作为最终结果,我需要从代理表中检索代理名称。我接受你的回答,因为你最终让我解决了我的问题。我只是不确定我是否做得对。 抱歉旧评论。误读了代码。我已经更新了评论。以上是关于多对多关系的 DQL 语句的主要内容,如果未能解决你的问题,请参考以下文章