0

我可能已经在某个地方谋杀了 MVC 的整个概念,但我目前的情况是:

participantsevents它们之间有一个 HABTM 关系(带有一个关联的字段money_raised)。我有一个控制器,它成功地在预先存在的事件和参与者之间创建了新的 HABTM 关系,它完全按照我的意愿工作。

创建新关系时,我希望将 flash 设置为包含刚刚添加的参与者的名称。实际添加是使用 ids 完成的,所以我使用了以下代码:

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`)

最后一个似乎是多余的(而且相当昂贵),因为第二个应该给我我需要的所有东西,但是删除$this->EventsParticipant->Participant->findById($participant_id)第二个和第三个查询(这对我来说有点道理,但不完全)。

我能做些什么来弥补这种冗余(如果我确实没有错,那就是冗余)?请告诉我我是否已经对这些事情应该如何工作进行了完整的哈希处理——我对此很陌生。

4

1 回答 1

1

这可能是由于默认的递归设置拉动了关系。您可以通过public $recursive = -1;在模型上进行设置来解决此问题(注意这会影响所有查找调用)。或者,为此查找暂时禁用它:

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

总是建议public $recursive = -1;在你的 AppModel 上设置并使用Containable在你需要的地方引入相关数据。

于 2012-06-12T23:42:14.343 回答