Join 双向连接条件?

Join 双向连接条件?,join,symfony1,symfony-1.4,criteria,propel,Join,Symfony1,Symfony 1.4,Criteria,Propel,我在做一个symfony项目,和propel ORM合作。在我的模型中,我有一个表,其中的元素可以通过另一个表(链接表)与同一表的许多元素链接。一些代码可以更好地解释: table1: id_element: integer; [...] 和链接表: link_table: id1: fk to table1; id2: fk to table1; 我需要构建一个带有推进条件的查询,该查询将返回具有特定元素的所有相关元素。问题是我要指定的元素可以是链接表

我在做一个symfony项目,和propel ORM合作。在我的模型中,我有一个表,其中的元素可以通过另一个表(链接表)与同一表的许多元素链接。一些代码可以更好地解释:

table1:
    id_element: integer;
    [...]
和链接表:

 link_table:
     id1: fk to table1;
     id2: fk to table1;
我需要构建一个带有推进条件的查询,该查询将返回具有特定元素的所有相关元素。问题是我要指定的元素可以是链接表的id1字段和id2字段

现在,我的一些标准定义代码(显然不起作用)

这是我想要生成的SQL:

SELECT * FROM table
    WHERE table.ID IN
        (SELECT link_table.ID1 FROM link_table
            WHERE link_table.ID2 = "the id that i want"
        )
    OR table.ID IN 
        (SELECT link_table.ID2 FROM link_table
            WHERE link_table.ID1 = "the id that i want"
        )
所以我必须做两个连接,链接表的每边一个?有没有办法进行“
或联接”
?请帮帮我


非常感谢您抽出时间:)

也许我不太明白您需要什么。。。一个表有两个外键,它们都链接到同一个表,因此id为,并且需要or联接。为什么不分成两个标准和两个选择?

只是大声想一想——这在功能上与此相同:

SELECT
    *
FROM
    my_table
LEFT JOIN
    link_table lt1 ON (lt1.id1 = my_table.id)
LEFT JOIN
    link_table lt2 ON (lt2.id2 = my_table.id)
WHERE
    lt1.id2 = X
OR
    lt2.id1 = X

如果这是相同的(显然要检查),那么为其构建查询应该容易得多。此外,如果可以的话,尝试使用ModelCriteria-我怀疑Streep 2中的Criteria会被弃用,提前计划是个好主意。

避免使用
Criteria
,正如halfer所说,最好使用
ModelCriteria
及其API。阅读以下文档了解更多信息:

最后,我找到了一种使用标准的方法:

$c = new Criteria();
    $q1 = new Criteria();
    $q1->add($linkPeer::ID1,$my_value);
    result1 = $linkPeer->doSelect($q1);
    foreach($result1 as $result){
        ids1[] = $result->getID();
    }
    $q2 = new Criteria();
    $q2->add($linkPeer::ID2,$my_value);
    result2 = $linkPeer->doSelect($q2);
    foreach($result2 as $result){
        ids2[] = $result->getID();
    }
$ids = array_merge($ids1,$ids2);
$c->add($tablePeer::ID,$ids,Criteria::IN);
$totalResult = $tablePeer->doSelect($c);
也许不是最好的方法,但效果很好


非常感谢您的回答

也许您应该重新考虑您的解决方案,在关系数据库上不鼓励这种递归行为。你能给我一点关于这个模型试图代表什么的更多信息吗。大多数时候,我发现自己有复杂的查询,这几乎总是意味着我没有把问题想清楚。下面的表格代表了一个过程。这些过程可以与其他过程相关联,形成多对多关系,这种关系必须作为链接表来实现(我的大学老师如是说)就像我做的那样。因为作为我的select操作的结果,我需要一个表中唯一实体的数组。循环中不必要的水合作用会大大降低查询速度,具体取决于迭代次数。如果您想这样做,我会用
doSelectStmt
交换第4行和第10行的
doSelect
(并在每个循环中进行必要的调整)。
$c = new Criteria();
    $q1 = new Criteria();
    $q1->add($linkPeer::ID1,$my_value);
    result1 = $linkPeer->doSelect($q1);
    foreach($result1 as $result){
        ids1[] = $result->getID();
    }
    $q2 = new Criteria();
    $q2->add($linkPeer::ID2,$my_value);
    result2 = $linkPeer->doSelect($q2);
    foreach($result2 as $result){
        ids2[] = $result->getID();
    }
$ids = array_merge($ids1,$ids2);
$c->add($tablePeer::ID,$ids,Criteria::IN);
$totalResult = $tablePeer->doSelect($c);