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::ThisCOLUMN
和TableBPeer::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 - 连接不相关的表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Doctrine ORM 查询中查找与别名相关的表?