如何通过推进对象集合中的“id”获取对象?

时间:2012-09-03 16:30:44

标签: php propel

我正在使用Propel 1.6而且我不确定如何从推进对象集合中获取对象(给定其“id”属性值)。我在Propel的文档中找不到直接的答案(PropelCollection methods似乎不适用?)。例如: 假设我有一个“Person”表,其中包含以下模式:

<table name="person">
  <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
  <column name="name" type="VARCHAR" size="100" required="true"/>
</table>

我执行以下查询以获取“Person”对象的集合:

$persons = PersonQuery::create()->find();

然后,我想找到一个具有给定“id”的“Person”对象(例如“Person”,“id = 3”),而不对数据库进行新查询。我该怎么办?

$persons->get(...?)?

换句话说,我不想这样做:

$personX = PersonQuery::create()->findOneById(3);

上下文

我想阻止进行数据库查询以提高性能。该语句将插入到foreach语句中,否则将导致大量数据库连接,如下所示:

foreach ($books as $book) {
    $book['author_name'] = PersonQuery::create()->findOneById($book['author_id'])->getName();
}

5 个答案:

答案 0 :(得分:7)

另一种替代方法,特别是如果你需要多次搜索,就是通过带有$ collection-&gt; getArrayCopy('Id')的id来获取对象数组。

$persons = PersonQuery::create()->find();
$personsById = $persons->getArrayCopy('Id');

然后你可以做

$person = $personsById[3];

if (isset($personsById[3])) {
  $person = $personsById[3];
  ...
}

答案 1 :(得分:4)

嗯,这样效率不高,但你可以通过这个集合来找到它。

$persons = PersonQuery::create()->find();
foreach ($persons as $person)
{
  if (3 == $person->getId())
  {
    break;
  }
}

// now you have your person with id = 3
var_dump($person->getId());

答案 2 :(得分:3)

由于Propel没有正确缓存查询结果,因此需要迭代集合(如 @ j0k 所述)。您可以调用foreach来传递一个闭包(使用PHP 5.3),而不是使用array_filter循环。

// Request the persons
$persons = PersonQuery::create()->find();

// Filter the persons whose ID equals 3
$filteredPersons = array_filter($persons, function ($person) {
    return 3 === $person->getId();
});

// Get the first result
$person = empty($filteredPersons) ? null : $filteredPersons[0];

如果你确定找到了这个人,你也可以写下(用PHP 5.4)以下几行:

// Filter the person whose ID equals 3
$person = array_filter($persons, function ($person) {
    return 3 === $person->getId();
})[0];

答案 3 :(得分:2)

如果设置Propel :: isInstancePoolingEnabled()为true(默认为true),那么你可以

// Request the persons
$persons = PersonQuery::create()->find();
// get person from pool
$person = PersonPeer::getInstanceFromPool(3);
抱歉我的英语。

答案 4 :(得分:1)

Propel&gt; = 1.5的替代方案对user2663223的回答是:

$persons = PersonQuery::create()->find()

$person = PersonQuery::create()->findPk(3);

这利用了实例池。在内部,它使用:getInstanceFromPool,如果sql查询之前完成。

有关详细信息,请参阅:

http://propelorm.org/documentation/03-basic-crud.html#propel-instance-pool