0

propelorm/PropelBundle (Propel 1.6) および MySQL (宣言された外部キーを持つ InnoDB) で Symfony 2 を使用しており、次のようにカスタム SQL を使用して propel オブジェクト コレクションをハイドレートするセクションに示すようにカスタム SQL を使用しています。

$con = Propel::getConnection(VerbNounPeer::DATABASE_NAME);
$sql = "SELECT verb_noun.*, verb.* FROM verb_noun"
        ." JOIN verb ON verb_noun.verb_id = verb.id";
$stmt = $con->prepare($sql);
$stmt->execute();

$formatter = new PropelObjectFormatter();
$formatter->setClass('Company\SiteBundle\Model\VerbNoun');
$verb_nouns = $formatter->format($stmt);

注: これは実際のクエリではありません。要件を説明するために簡単な例を示しました。私の実際のクエリはより複雑であるため、推進メソッドではなく「カスタム SQL」を使用する必要があります。

結合されたテーブルの列を一度に推進オブジェクト コレクションにハイドレートすることはできませんでした。結合されたテーブル (「動詞」) の列は、データベースへの追加のクエリを通じて必要な場合にのみビューに読み込まれます (これは遅延読み込みと呼ばれるもので、私は望んでいません)。後でデータベースへの多数のクエリを排除するために、上記の最初のクエリで結合されたテーブル ('動詞') の列で propel オブジェクト コレクション ($verb_nouns) をハイドレートする方法はありますか?

上記のコードを以下のコード (Twig のビュー ファイル内) と一緒に使用すると、foreach ステートメントのループごとに 1 つのデータベース接続が作成されます。

{% for verb_noun in verb_nouns %}
    <li>{{ verb_noun.NounId }}.&nbsp;{{ verb_noun.verb.Name }}</li>
{% endfor %}
4

2 に答える 2

0

私があなたの質問を正しく理解していれば、手動のハイドレーションやカスタム クエリを実行する必要はありません。次のような結合メソッドの 1 つを使用するだけVerbNounQuery::create()->joinVerb()->find()で、名詞が既に入力された VerbNoun のコレクションが返されます。データベースへの 1 つのクエリですべてが返されます。

ちなみに、オートコンプリート IDE を強くお勧めします。クエリ システムをより簡単に探索するのに役立ちます。

于 2012-04-29T08:35:47.920 に答える