0

Initsが関連するPropel1.6で生成されたクラスグループがあり、Initsにはそれらに関連するRespsがあります。かなり簡単です。

これら2つのPropelコードの違いがわかりません。$notDeletedここで最初のものでは、すべてのループで基準を再作成します。このコードは私が望むことを実行します-それはすべての応答を$data配列に入れます。

foreach ($group->getInits() as $init) {
    $notDeleted = RespQuery::create()->filterByIsDeleted(false);
    foreach ($init->getResps($notDeleted) as $resp) {
        $data[] = $resp;
    }
}

ここで2番目のコードでは、$notDeleted(私が思っていたのは)明らかな効率上の理由から、基準をループから引き出しました。このコードは私が望むようには機能しません-それはInitsの1つからRespsを取得するだけです。

$notDeleted = RespQuery::create()->filterByIsDeleted(false);
foreach ($group->getInits() as $init) {
    foreach ($init->getResps($notDeleted) as $resp) {
        $data[] = $resp;
    }
}

メソッドが結果をキャッシュする方法と関係があるに違いないと思いましたgetResps()が、それはドキュメントやコードがそのメソッドで読み取る方法ではありません。ドキュメントとコードには、渡された基準がgetResps()nullでない場合、常にデータベースから結果が取得されると記載されています。たぶん他のPropelキャッシュ?

4

1 に答える 1

1

$init(まず、ループ内でvsを使用するつもり$initiativeだったと思います。それか、ここに表示されていない他のコードがあります。)

これが私の推測です: あなたの 2 番目の例では、オブジェクトを引き出しますが、呼び出し$notDeleted Criteriaのたびに内部を介して、Propelに現在のインスタンスを使用してインスタンスで a を実行させます。これにより、SQL に新しい条件が追加されますが、明らかに aは 1 つの値しか持てないため、結果は 1 つだけになります。foreachgetResps($notDeleted)filterByInit()CriteriaInitWHERERespInit.Id

それを引き出す正当な理由があるとは思いませんが、内部では Propel は新しい Criteria オブジェクトを作成し、渡されたオブジェクトのクローンを作成しているだけなので、実際のメモリは保存されません。

于 2013-03-15T20:07:45.987 に答える