2

DQLがどのように機能するかについて混乱しているので、ここで本当に助けが必要です。

「Band」、「Agent」、「BandAgent」という3つのテーブルがあります。

BandAgentは、agent_idとband_idを含む、多対多の関係の中間テーブルです。

DQLステートメントを使用して特定のband_idに関連するすべてのエージェントを取得するにはどうすればよいですか?


編集

このコードは機能しますが、それが正しい方法かどうかはわかりません。BandbyBandIDに関連するすべての関連エージェントを画面にエコーします。

//$band is a Band Table Row
$bandAgentTable = Doctrine_Core::getTable('BandAgent');
$agentTable = Doctrine_Core::getTable('Agent');

$bandAgentTable = $bandAgentTable->findByBandId($band->getId());
foreach ($bandAgentTable as $bandAgent) {   
    $agent = $agentTable->findById($bandAgent['agent_id']);
    echo $agent[0]['name'];
}

編集2

私はDoctrineについてたくさん読んでしまい、MagicFindersから離れてしまいました。次のコードは、誰かが興味を持っている場合、多対多の問題に対して私がやったことです。

public function getRelatedAgents() {
$q = Doctrine_Query::create()
   ->from('Band b')
   ->leftJoin('b.Agents a')
   ->where('b.id = ?', $this->getId());
$bands = $q->fetchArray();
return $bands[0]['Agents'];
}
4

1 に答える 1

3

DoctrineはMagicFindersを提供しています。

$bandAgentTable = Doctrine_Core::getTable('BandAgent');    
$bandAgentTableSearch = $bandAgentTable->findByBand($band);

Bandこれにより、テーブル内の列が検索BandAgentされ、変数と一致します$band

ファインダーメソッドの基本的なパターンは次のとおりです 。findBy%s($value)または findOneBy%s($value)。は%s、列名またはリレーションエイリアスにすることができます。列名を指定する場合は、探している値を指定する必要があります。リレーションシップエイリアスを指定する場合は、リレーションクラスのインスタンスを渡して検索するか、実際の主キー値を指定できます。

更新:編集に応じて、2つの列を一緒に検索することもできます。

$agent = $bandAgentTable->findByBandIdAndId($band->getId(), $bandAgent['agent_id']);
于 2010-08-13T22:18:22.027 に答える