CakePHP patchEntity 不保存数据(“通过”关联)
Posted
技术标签:
【中文标题】CakePHP patchEntity 不保存数据(“通过”关联)【英文标题】:CakePHP patchEntity not saving data ("through" association) 【发布时间】:2016-11-23 07:28:13 【问题描述】:我是 Cakephp 的新手,我一直在使用 CakePHP 食谱和 *** 来尝试解决我的问题,但无法解决。这可能有点傻。
我有 Quotes、Items 和可连接的 joindata QuotesItems。
我的 edit.ctp(模板引用)中有这个:
<div class="quotes form large-9 medium-8 columns content">
<?= $this->Form->create($quote) ?>
<fieldset>
<legend><?= __('Edit Quote') ?></legend>
<?php
echo $this->Form->input('customer_id', ['options' => $customers]);
echo $this->Form->input('items._ids', ['options' => $items]);
$counter = 0;
foreach($quote['items'] as $item):
echo $this->Form->input( "items.$counter.description", array( 'disabled' => 'disabled' ) );
echo $this->Form->input("items.$counter._joinData.item_quantity");
$counter++;
endforeach
?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>
</div>
在我有编辑功能的 QuotesController 中:
public function edit($id = null)
$quote = $this->Quotes->get($id, [
'contain' => ['Items']
]);
if ($this->request->is(['patch', 'post', 'put']))
$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['Quotes._joinData']);
//$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]] );
if ($this->Quotes->save($quote))
debug($this->request->data);
$this->Flash->success(__('The quote has been saved.'));
//return $this->redirect(['action' => 'index']);
else
$this->Flash->error(__('The quote could not be saved. Please, try again.'));
$customers = $this->Quotes->Customers->find('list', ['limit' => 200]);
$items = $this->Quotes->Items->find('list', ['limit' => 200]);
$this->set(compact('quote', 'customers', 'items'));
$this->set('_serialize', ['quote']);
表单保存时发送的数组为:
[
'customer_id' => '1',
'items' => [
'_ids' => [
(int) 0 => '1'
],
(int) 0 => [
'_joinData' => [
'item_quantity' => '18'
]
]
]
]
我已经检查了食谱的保存“保存数据”,但它没有清除我做错了什么。
数据需要报价的ID吗?我迭代项目的方式是否正确?
表关联如下: 引用:
$this->belongsToMany('Items', [
'through' => 'QuotesItems'
]);
项目:
$this->belongsToMany('Quotes', [
'through' => 'QuotesItems'
]);
QuotesItems(可连接):
$this->belongsTo('Quotes', [
'foreignKey' => 'quote_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Items', [
'foreignKey' => 'item_id',
'joinType' => 'INNER'
]);
提前致谢!
【问题讨论】:
【参考方案1】:尝试使数组格式如下:
[
'customer_id' => '1',
'items' => [
'id' => 1, // this is primary key of items table
'item_quantity' => '18' // this is another field of items table
]
]
并且在您的编辑方法中使用注释行:
$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]] );
【讨论】:
感谢您的回复。当我将您提到的行放在控制器中时,我得到一个异常“无法为“QuoteItems”关联编组数据。它与“报价”无关。除此之外,我很惊讶 cakePhp 无法通过使用 cake bake 命令来处理这样的“基本”场景,并且我不得不修改数据(我可以在不同的场景中理解,但这似乎是基本的)。虽然 cakephp 有很多文档,但并没有真正解释清楚。 忘了说:我看到你在项目下面有 ID。还有 item_quantity。这不应该嵌套在 _joinData 中吗?我确实有一个可连接的主键,所以我希望它在数据中也是必要的?提前致谢。 是的,如果表处于正确的关系中,并且没有嵌套在 _joinData 中。我之前检查过,效果很好。 如果这样的事情变得更难,那么删除和重新插入也可能是更好的选择。 "是的,如果表的关系正确,可以不嵌套在 _joinData 中工作。我之前检查过,效果很好。"以上是关于CakePHP patchEntity 不保存数据(“通过”关联)的主要内容,如果未能解决你的问题,请参考以下文章
CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段