从父控制器创建新的 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 孩子的主要内容,如果未能解决你的问题,请参考以下文章