问题可归结为在迭代结果时找到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
提供确切的用例,因为一开始可能不清楚我在寻找什么。我有一个包含>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);
}
答案 0 :(得分:1)
使用select()
时,Propel会跳过对象水化,只返回包含每个结果行数组的ArrayCollection
。
要检索每个结果行的id
,您需要将列名添加到select()
。然后,您可以使用列名称从行数组中检索值:
$users = UserQuery::create()
->select(['id', 'a', 'b'])
->orderBy('c')
->find();
foreach ($users as $user) {
$id = $user['id'];
}
选择功能在documentation和Propel\Runtime\ActiveQuery\ModelCriteria#select()
(source)的文档块中进行了描述。
使用Propel 1时,功能相同。请在Propel 1 documentation或ModelCriteria#select()
(source)的文档块中详细了解相关内容。