Propel ORM - 连接不相关的表

问题描述 投票:0回答:3

这个 SQL 语句如何翻译成 Propel (1.6.3)?

SELECT * FROM table_a JOIN table_b

表 A 和表 B 不共享外键并且没有定义关系。

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

不起作用,因为 Propel 抱怨错误:

“致命错误:未捕获异常‘PropelException’,消息为‘TableA 表上的未知关系 TableB’

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

php sql orm propel
3个回答
42
投票

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

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

第三个参数也采用左连接和右连接。

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

->filterByOtherColumn(value)

你可以使用“add()”,如下所示:

->add(TableAPeer::OtherCOLUMN, value)

0
投票

您可以使用原始 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:输出不是很干净,是数字键和关联键的数组。也许有办法可以改善这一点。


0
投票

以下是如何通过 Propel 2 中的

addSelectQuery
来完成此操作,这基本上创建了一个 CROSS JOIN。这是将 Item 实体与 Product 实体连接起来,示例来自 Spryker:

     return $this->getFactory()
        ->createPyzResourceToOrderQuery()
        ->select([
            PyzResourceToOrderTableMap::COL_FK_CUSTOMER,
            PyzResourceToOrderTableMap::COL_FK_SALES_ORDER,
        ])
        ->leftJoin('SpySalesOrder.Item')
        ->addSelectQuery(
            $this->getFactory()->createProductQuery()
                ->addAsColumn('fk_product_abstract', SpyProductTableMap::COL_FK_PRODUCT_ABSTRACT)
                ->addAsColumn('sku', SpyProductTableMap::COL_SKU),
            't',
        )
        ->where('t.sku = Item.sku')...
© www.soinside.com 2019 - 2024. All rights reserved.