【问题标题】:Phalcon: specific column on joined PHQLPhalcon:加入 PHQL 的特定列
【发布时间】:2015-09-03 04:04:35
【问题描述】:

下面的 PHQL 会生成一个复杂的结果集:

$phql = "SELECT User.*, ProductUser.* "
      . "FROM ProductUser "
      . "INNER JOIN User "
      . "WHERE ProductUser.product_id = 5";

ProductUser.* 替换为现有列,如 ProductUser.id 会导致错误:

MESSAGE: 行中不存在索引
文件:phalcon/mvc/model/row.zep
线路:67

这是 2.0.6 版。这是一个错误还是我在某个地方犯了错误?根据documentation 应该没问题。

【问题讨论】:

    标签: phalcon


    【解决方案1】:

    这是我的错误(期望该行始终是一个对象)。
    我希望这对某人有所帮助,因为循环复杂的结果集不在文档中。

    $result = $this->modelsManager->createQuery($phql)->execute();
    
    if ($result instanceof \Phalcon\Mvc\Model\Resultset\Complex) {
        foreach ($result as $rows) {
            foreach ($rows as $row) {
                if (is_object($row)) {
                    $modelData = $row->toArray());
                // this is what I needed
                } else {
                    $id = $row;
                }
            }
        }
    }
    

    【讨论】:

    • 您可能有 ProductUser 和 User 表的模型,为什么不使用 queryBuilder 或内部 Phalcons 的模型关系声明?
    • @yergo 是的,queryBuilder 将给出相同的结果。我希望我可以使用模型关系,但我不知道如何在其中获取“SELECT User.*, ProductUser.id”部分。
    【解决方案2】:

    首先,您的查询中缺少ON clause

    无论如何,使用Phalcon's query builder 进行查询更容易且更容易出错:

    <?php
    
    // modelManager is avaiable in the default DI
    $queryBuilder = $this->modelsManager->createBuilder();
    $queryBuilder->from(["product" => 'Path\To\ProductUser']);
    
    // Inner join params are: the model class path, the condition for the 'ON' clause, and optionally an alias for the table
    $queryBuilder->innerJoin('Path\To\User', "product.user_id = user.id", "user");
    
    $queryBuilder->columns([
        "product.*",
        "user.*"
    ]);
    
    $queryBuilder->where("product.id = 5");
    
    // You can use this line to debug what was generated
    // $generatedQuery = $queryBuilder->getPhql();
    // var_dump($generatedQuery);
    
    // Finish the query building
    $query = $queryBuilder->getQuery();
    
    // Execute it and get the results
    $result = $query->execute();
    
    // Now use var_dump to see how the result was fetched
    var_dump($result);
    exit;
    

    【讨论】:

    • 感谢您的回答。错误来自 phalcon/mvc/model/row。顺便说一句,您并不总是需要在 PHQL 中使用 ON 子句,但是是的,我最终使用它来获得正确的结果。
    • @galki 当您不需要使用ONclause 时?!什么时候在表架构中设置了 FK?
    • 是的,看看我的问题中的链接。我注释掉了我所有的模型关系,但它仍然给了我一个错误的结果:/
    • @galki 这很奇怪,反正你为什么不使用内置方法来获取相关记录?!当您设置关系时,您可以提供一个别名,然后简单地使用类似$product-&gt;user 的东西。不确定您的上下文是什么,但它可能会更容易和更快,因为只有在您需要时才会获取 user 属性。
    • 这是一个棘手的情况,使用模型 A B 和 C 动态生成多对多查询,除了获取关系 C 之外,我还需要获取 B.id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2017-09-30
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多