从父控制器创建新的 hasMany 孩子

Posted

技术标签:

【中文标题】从父控制器创建新的 hasMany 孩子【英文标题】:Create new hasMany children from parent controller 【发布时间】:2021-12-05 15:10:34 【问题描述】:

我有两个控制器“事件”和“活动”,并且都有很多“参与者”。

$this->hasMany('Attendees')
    ->setClassName('Attendees')
    ->setForeignKey('foreign_id')
    ->setConditions(array('Attendees.class' => 'Activity'))
    ->setDependent(true);

我在我的参加者表中使用一个班级和一个 foreign_id 来链接它们。我想在我的 ActivitiesController 中创建 addAttendee() 函数,例如添加一个新的与会者,但我不知道如何继续。

public function addAttendee($id = null)

    $activity = $this->Activities->get($id, ['contain' => ['Venues', 'Contacts']]);

    if ($this->request->is('post'))
    
        ??
    

    $this->set(compact('activity'));

我找到了一些关于保存关联但没有创建新关联的文档。

【问题讨论】:

首先,您需要确保关联的保存策略是append,而不是replace 【参考方案1】:

您可以创建一个新的Attendee 实体,然后将其链接到您的$activity

$data = ['first_name' => 'blah', 'last_name' => ... fields]);
$attendee = $this->Attendee->newEntity($data);

$this->Attendee->link($activity, [$attendee]);

来源:https://api.cakephp.org/4.2/class-Cake.ORM.Association.HasMany.html#link()

【讨论】:

谢谢。但我想使用一个表格来创建与会者。所以我在下面使用了 loadmodel() 但不确定它是否是正确的方法。 您的$this->request->getData() 是什么样的?如果您有 attendees 键并且您的字段遵循约定,那么 cake 应该会自动保存关联。 有趣的事实:如果您定义了 hasMany 关联,则不需要加载模型。你可以打电话给$this->Activities->Attendees 我的 getData() 是一个数组 :^ array:10 [▼ "title" => "Mr" "firstname" => "John" "lastname" => "Doe" "address" = > “地址” “城市” => “城市” “邮政编码” => “xxxx” “国家” => “国家” “电子邮件” => “john@doe.com” “电话” => “xxxxxxxxx” “付款方式” " => "xxxxxx" ] 嗯。是的,试着用attendees 键说。 book.cakephp.org/3/en/orm/…【参考方案2】:

我是这样进行的。它正在工作,但不确定它是否是正确的继续方式??

public function addAttendee($id)

    $activity = $this->Activities->get($id, ['contain' => ['Venues', 'Contacts']]);
    $attendee = $this->Activities->Attendees->newEmptyEntity();

    if ($this->request->is('post'))
    
        $attendee = $this->Activities->Attendees->patchEntity($attendee, $this->request->getData() + ['class' => 'retreat', 'foreign_id' => $id]);

        if ($this->Activities->Attendees->save($attendee))
        
            $this->Flash->success(__('The attendee has been saved.'));
            return $this->redirect(['action' => 'view', $id]);
        

        $this->Flash->error(__('The attendee could not be saved. Please, try again.'));
    

    $this->set(compact('activity', 'attendee'));

【讨论】:

以上是关于从父控制器创建新的 hasMany 孩子的主要内容,如果未能解决你的问题,请参考以下文章

Grails:如何在 hasMany 关系中搜索孩子?

NHibernate在脚下射击:协会所有权和版本控制

从父类返回子类

我可以使用 state AND props 在父/子之间进行控制吗

Laravel 5.8 中 hasMany 关系的条件

从父控制器访问子模型