【问题标题】:DQL statement for many to many relationship多对多关系的 DQL 语句
【发布时间】: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'];
}

【问题讨论】:

    标签: orm symfony1 doctrine dql


    【解决方案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之间的连接表。作为最终结果,我需要从代理表中检索代理名称。我接受你的回答,因为你最终让我解决了我的问题。我只是不确定我是否做得对。
    • 抱歉旧评论。误读了代码。我已经更新了评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多