推进 - 找到后获取主键

时间:2016-06-15 23:16:06

标签: php orm propel

问题可归结为在迭代结果时找到getPrimaryKey的正确方法。使用select方法时,结果是ArrayCollection的对象,它不提供getPrimaryKey方法。一个简单的片段

$q = UserQuery::create();
$q->select('a', 'b'); //yields an ArrayCollection object, doesn't have getPrimaryKey method when iterated
$q->find();

然而,

$q = UserQuery::create();
$q->find(); //yields an ObjectCollection object, has getPrimaryKey method when iterated

更新

我尝试使用setFormater强制使用ObjectCollection。最终,它导致异常被抛出。

$q = UserQuery::create()
         ->setFormater(ModelCriteria::FORMAT_OBJECT)
         ->select('a', 'b')
         ->find();  //Error populating object

更新2

提供确切的用例,因为一开始可能不清楚我在寻找什么。我有一个包含>100列的表格。我使用behaviour提供功能,以禁用其中一些(不是select)。因此,我取消了一些列,并将$q->select基于其余列。

if (!empty($tableQuery->tableColumnsDisable)) {
    $columns = $tableQuery->getTableMap()->getColumns();

    foreach ($columns as $index => $column) {
        if (!empty($tableQuery->tableColumnsDisable[$column->getName()])) {
            unset($columns[$index]);

            continue;
        }

        $columns[$index] = $column->getName();
    }

    //TODO - returns array collection, object collection needed
    $tableQuery->select($columns);
}

1 个答案:

答案 0 :(得分:1)

使用select()时,Propel会跳过对象水化,只返回包含每个结果行数组的ArrayCollection。 要检索每个结果行的id,您需要将列名添加到select()。然后,您可以使用列名称从行数组中检索值:

$users = UserQuery::create()
    ->select(['id', 'a', 'b'])
    ->orderBy('c')
    ->find();

foreach ($users as $user) {
    $id = $user['id'];
}

选择功能在documentationPropel\Runtime\ActiveQuery\ModelCriteria#select()source)的文档块中进行了描述。

使用Propel 1时,功能相同。请在Propel 1 documentationModelCriteria#select()source)的文档块中详细了解相关内容。