0

私はおそらくMVCの概念全体をどこかで殺してしまいましたが、私の現在の状況は次のとおりです。

participantsそれらの間にHABTM 関係がeventsあります (関連付けられたフィールドを使用money_raised)。私は、既存のイベントと参加者の間に新しい HABTM 関係を正常に作成するコントローラーを持っています。これは、希望どおりに機能します。

新しい関係が作成されたら、追加したばかりの参加者の名前を含めるようにフラッシュを設定したいと思います。実際の追加は ID を使用して行われるため、次のコードを使用しました。

public function addParticipantToEvent($id = null) {
    $this->set('eventId', $id);

    if ($this->request->is('post')) {
        if ($this->EventsParticipant->save($this->request->data)) {
            $participant_id = $this->request->data['EventsParticipant']['participant_id'];
            $money_raised = $this->request->data['EventsParticipant']['money_raised'];
            $participant_array = $this->EventsParticipant->Participant->findById($participant_id);
            $participant_name = $participant_array['Participant']['name'];
            $this->Session->setFlash('New participant successfully added: ' . $participant_name . ' (' . $participant_id . ') ' . '— £' . $money_raised);
        } else {
            $this->Session->setFlash('Unable to create your event-participant link.');
        }
    }
}

これは機能しますが、次の SQL クエリが生成されます。

INSERT INTO `cakephptest`.`cakephptest_events_participants` (`event_id`, `participant_id`, `money_raised`) VALUES (78, 'crsid01', 1024)     1   1   0

SELECT `Participant`.`id`, `Participant`.`name`, `Participant`.`college` FROM `cakephptest`.`cakephptest_participants` AS `Participant` WHERE `Participant`.`id` = 'crsid01' LIMIT 1        1   1   0

SELECT `Event`.`id`, `Event`.`title`, `Event`.`date`, `EventsParticipant`.`id`, `EventsParticipant`.`event_id`, `EventsParticipant`.`participant_id`, `EventsParticipant`.`money_raised` FROM `cakephptest`.`cakephptest_events` AS `Event` JOIN `cakephptest`.`cakephptest_events_participants` AS `EventsParticipant` ON (`EventsParticipant`.`participant_id` = 'crsid01' AND `EventsParticipant`.`event_id` = `Event`.`id`)

この最後の 1 つは、2 番目のクエリで必要なものがすべて得られるはずなので、余分な (そしてかなりコストがかかる) ように見えますが、削除する$this->EventsParticipant->Participant->findById($participant_id)と 2 番目と 3 番目のクエリの両方が削除されます (これは意味がありますが、完全ではありません)。

この冗長性を改善するにはどうすればよいですか (実際に冗長性であることが間違っていない場合)。この種のことがどのように機能するかについて完全なハッシュを作成したかどうか教えてください。私はこれに非常に慣れていません。

4

1 に答える 1

1

これはおそらく、関係を引き出すデフォルトの再帰設定が原因です。モデルに設定することでこれを修正できpublic $recursive = -1;ます (これはすべての検索呼び出しに影響することに注意してください)。または、この検索のために一時的に無効にします。

$this->EventsParticipant->Participant->recursive = -1;
$this->EventsParticipant->Participant->findById($participant_id);

AppModel に設定し、 Containableを使用して必要な関連データを取り込むことを常にお勧めします。public $recursive = -1;

于 2012-06-12T23:42:14.343 に答える