【问题标题】:Propel ORM - Joining unrelated tablesPropel ORM - 连接不相关的表
【发布时间】: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、...

标签: php sql orm propel


【解决方案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()),这几乎是不可能实现的:-(我可能会使用几个 (单独)查询,然后使用对象“制造”我需要的结果格式......
  • 好的,我明白了。无论如何,感谢您接受答案:)。您从不同对象“制造”结果的想法似乎是要走的路!祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2013-08-06
  • 2020-07-15
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多