9

Propel 1.6 を使用していますが、propel オブジェクト コレクションからオブジェクトを取得する方法がわかりません (その「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>

「Person」オブジェクトのコレクションを取得するために、次のクエリを実行します。

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

次に、データベースに新しいクエリを作成せずに、特定の「id」を持つ「Person」オブジェクト (「id=3」の「Person」など) を検索したいと考えています。どうすればいいですか?

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

言い換えれば、私はやりたくない:

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

環境:

パフォーマンスを向上させるためにデータベース クエリを作成しないようにしたいと考えています。ステートメントは、次のように、そうでなければ多数のデータベース接続につながる foreach ステートメント内に挿入されます。

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

5 に答える 5

8

もう 1 つの方法は、特に何度も検索する必要がある場合は、$collection->getArrayCopy('Id') を使用して ID でオブジェクトの配列を取得することです。

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

それからあなたはすることができます

$person = $personsById[3];

また

if (isset($personsById[3])) {
  $person = $personsById[3];
  ...
}
于 2014-07-25T20:04:20.100 に答える
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());
于 2012-09-03T16:34:12.107 に答える
3

Propel はクエリ結果を適切にキャッシュしないため、( @j0kが言ったように) コレクションを反復する必要があります。ループを使用する代わりに、クロージャを渡してforeach呼び出すことができますarray_filter(PHP 5.3 を使用)。

// 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];
于 2012-09-04T08:12:49.050 に答える
2

Propel::isInstancePoolingEnabled() を true (デフォルトで true) に設定すると、次のことができます。

// Request the persons
$persons = PersonQuery::create()->find();
// get person from pool
$person = PersonPeer::getInstanceFromPool(3);

私の英語でごめんなさい。

于 2013-08-26T09:41:06.720 に答える
1

user2663223 の答えに対する Propel >=1.5 の代替案は次のようになります。

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

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

これは、インスタンス プールを利用します。内部的には次を使用します: getInstanceFromPool (SQL クエリが以前に実行された場合)。

詳細については、以下を参照してください。

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

于 2014-07-11T12:42:41.853 に答える