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

Ray*_*Air 8 php propel

我正在使用Propel 1.6并且我不确定如何从推进对象集合中获取对象(给定其"id"属性值).我在Propel的文档中找不到直接的答案(PropelCollection方法似乎不适用?).例如:假设我有一个"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>
Run Code Online (Sandbox Code Playgroud)

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

$persons = PersonQuery::create()->find();
Run Code Online (Sandbox Code Playgroud)

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

$persons->get(...?)?
Run Code Online (Sandbox Code Playgroud)

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

$personX = PersonQuery::create()->findOneById(3);
Run Code Online (Sandbox Code Playgroud)

语境:

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

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

Ven*_*nev 7

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

$persons = PersonQuery::create()->find();
$personsById = $persons->getArrayCopy('Id');
Run Code Online (Sandbox Code Playgroud)

那你可以做

$person = $personsById[3];
Run Code Online (Sandbox Code Playgroud)

要么

if (isset($personsById[3])) {
  $person = $personsById[3];
  ...
}
Run Code Online (Sandbox Code Playgroud)


j0k*_*j0k 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());
Run Code Online (Sandbox Code Playgroud)