【问题标题】:Non-model join on PropelPropel 上的非模型连接
【发布时间】:2014-02-25 16:55:31
【问题描述】:

如何在 Propel 上写这个?架构:

obj
--
id
object_id

foo
--
id

SQL:

SELECT f.*
FROM
    foo f INNER JOIN obj o ON f.id=o.object_id
ORDER BY
    o.id
;

PHP:

$join = new \Join();
$join->addExplicitCondition(
    'foo', 'id', 'f',
    'obj', 'object_id', 'o',
    \Join::EQUAL
);

$join->setJoinType(\Criteria::INNER_JOIN);

$objectsQuery = FooQuery::create()
    ->setModelAlias('f', true)
    ->addJoinObject($join, 'o')
    ->addAscendingOrderByColumn('o.id') // error here
    ;

输出:

Cannot fetch TableMap for undefined table: o

我正在使用 Propel 1.7。请注意,我在“obj”和“foo”之间没有模型关系(它应该是多态关系)。而且我宁愿避免编写自定义 SQL。谢谢。

【问题讨论】:

  • 您确定需要addJoinObject 的第二个参数吗?试试->addJoinObject($join)
  • 试过了...没有任何变化。
  • 如果你做了->addAscendingOrderByColumn('obj.id')呢?
  • ->addAscendingOrderByColumn('obj.id') 没有帮助。但是->addAlias($join->getRightTableAlias(), $join->getRightTableName()) 做到了。
  • 发布得太早了 :) 忘记了 ENTER 发送评论 :P 有什么帮助,是 ->addAlias($join->getRightTableAlias(), $join->getRightTableName())。所以,最终查询是:$objectsQuery = FooQuery::create()->setModelAlias('f', true)->addJoinObject($join, 'o')->addAlias($join->getRightTableAlias(), $join->getRightTableName())->addAscendingOrderByColumn('o.id');

标签: php propel


【解决方案1】:

原来添加 JoinObject 并没有添加正确的别名,所以我必须自己添加它们。这有效:

$objectsQuery = FooQuery::create()
   ->setModelAlias('f', true)
   ->addJoinObject($join, 'o') // 'o' here makes no difference, actually
   ->addAlias($join->getRightTableAlias(), $join->getRightTableName())
   ->addAscendingOrderByColumn('o.id');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2014-08-30
    • 2023-03-17
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多