CakePHP&;MVC&x2013;查找';名称';与ID关联

CakePHP&;MVC&x2013;查找';名称';与ID关联,php,cakephp,join,has-and-belongs-to-many,Php,Cakephp,Join,Has And Belongs To Many,我可能在某个地方扼杀了MVC的整个概念,但我目前的情况是: 我在事件中有参与者,他们之间有HABTM关系(有一个相关字段筹款)。我有一个控制器,它成功地在预先存在的事件和参与者之间创建了新的HABTM关系,这正是我想要的 创建新关系时,我希望将flash设置为包含刚刚添加的参与者的姓名。实际上,添加是使用ID完成的,因此我使用了以下代码: public function addParticipantToEvent($id = null) { $this->set('eventId'

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

我在
事件中有
参与者
,他们之间有HABTM关系(有一个相关字段
筹款
)。我有一个控制器,它成功地在预先存在的事件和参与者之间创建了新的HABTM关系,这正是我想要的

创建新关系时,我希望将flash设置为包含刚刚添加的参与者的姓名。实际上,添加是使用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`)
最后一个似乎是多余的(而且相当昂贵),因为第二个应该能满足我的所有需求,但是删除
$This->EventsParticipant->Participant->findById($Participant\u id)
会同时删除第二个和第三个查询(这对我来说是有意义的,但并不完全)


我能做些什么来弥补这种冗余(如果我确实没有错,这是一种冗余)?请告诉我,我是否已经对这类事情的工作方式做了一个完整的分析——我对此非常陌生。

这可能是由于默认设置拉动了关系。您可以通过设置
public$recursive=-1(注意这将影响所有查找调用)。或者,为此查找暂时禁用它:

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

我总是建议设置
public$recursive=-1
在您的AppModel上,并使用它将相关数据带到您需要的位置。

我确信我以前尝试过,但没有效果,但我刚刚再次尝试,它完全符合我的要求,因此我以前一定做了错事。非常感谢。