多对多关系的 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 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何编写通过关系表获取结果的 SQL 语句? (多对多)

hibernate对象关系实现多对多实现

数据库中多对多关系及其实现

使用Navicat多对多关系SQL语句在MySQL中实现

TP中的模型关联的多对多关系

SQLAlchemy_定义(一对一/一对多/多对多)关系