Propel ORM - 连接不相关的表

Posted

技术标签:

【中文标题】Propel ORM - 连接不相关的表【英文标题】:Propel ORM - Joining unrelated tables 【发布时间】:2013-09-19 08:44:37 【问题描述】:

这条 SQL 语句如何转换成 Propel (1.6.3)?

SELECT * FROM table_a JOIN table_b

tableA 和 tableB 没有共享外键,也没有定义任何关系。

TableAQuery::create()->join('tableB')

由于 Propel 报错而无法正常工作:

“致命错误:未捕获的异常 'PropelException' 带有消息 'Unknown relationship TableB on the TableA table'

非常感谢任何帮助和提示!这是我在这里的第一篇文章,我希望我还没有做错任何事情:-)(在发布之前我已经彻底搜索了!)

【问题讨论】:

你能解释一下为什么你没有在两个可连接的表之间声明关系吗? (你的问题对我来说似乎没问题 - 之前的研究和尝试。我添加了一些代码和引用格式 - 你可以使用问题框上方的按钮来实现这一点)。 @halfer:谢谢格式化! @halfer:这两个表之间的关系在应用程序的业务逻辑中没有意义,但需要自动导出以进行进一步处理。这就像将“houses h”与“fruits f”连接起来以获得所有可能的组合:h1-f1、h1-f2、h1-f3、h2-f1、h2-f2、h2-f3、... 【参考方案1】:

您也可以像这样使用“addJoin”:

TableAQuery::create()
->addJoin(TableAPeer::ThisCOLUMN, TableBPeer::ThatCOLUMN, Criteria::INNER_JOIN); //Can also be left/right

第三个参数也是左右连接。

而且,而不是通常的“filterByXXX()

->filterByOtherColumn(value)

你会使用“add()”,像这样:

->add(TableAPeer::OtherCOLUMN, value)

【讨论】:

您应该强调TableAPeer::ThisCOLUMNTableBPeer::ThatCOLUMN 必须按照addJoin() 中显示的顺序 - 如果您不这样做,它将不起作用 在 Propel 1.4.x 上,您需要使用:Criteria::INNER_JOIN 而不是 , Criteria::INNERJOIN。 在 Propel 2 上,语法略有不同:\TableAQuery::create()->addJoin(\TableATableMap::COL_THIS_COLUMN, \TableBTableMap::COL_THAT_COLUMN, Criteria::INNER_JOIN); 作为当前接受答案的作者,我要求@Thomas接受这个答案,因为它是更好的解决方案。谢谢! 正确答案!【参考方案2】:

您可以通过使用原始 SQL 语法来解决此限制。例如:

$con = Propel::getConnection(SomePeer::DATABASE_NAME);
$query = 'SELECT * FROM `table_a` JOIN `table_b` LIMIT 10';
$stmt = $con->prepare($query);
if($stmt->execute()) 
    $res = $stmt->fetchAll();
    var_dump($res);

注意 #1:这类连接可能会变得非常大,并很快耗尽允许的内存大小。这就是我添加LIMIT的原因。

注意 #2:输出不是很干净,包含数字键和关联键的数组。也许有办法改善这一点。

【讨论】:

这确实适用于我发布但简化的示例。但是,在我正在使用的应用程序中,查询包含很多相关的表(广泛使用 ->use()),这几乎是不可能实现的:-(我可能会使用几个 (单独)查询,然后使用对象“制造”我需要的结果格式...... 好的,我明白了。无论如何,感谢您接受答案:)。您从不同对象“制造”结果的想法似乎是要走的路!祝你好运

以上是关于Propel ORM - 连接不相关的表的主要内容,如果未能解决你的问题,请参考以下文章

如何获取相关对象 Propel ORM

如何在 Doctrine ORM 查询中查找与别名相关的表?

如何将 Propel ORM 与 Informix 数据库连接

推动 ORM 自引用外键

Propel ORM:如果这样的对象不存在,如何仅保存对象

PHP ORM:Doctrine vs. Propel