【发布时间】:2015-06-27 19:48:17
【问题描述】:
我正在尝试使用 CakePHP 将一些数据保存到联合表中。这是我要修复的应用程序的一部分 - 它是与其他列的正常 BelongsToMany 关联:
模型>实体:
/* Durations */
class Duration extends Entity {
protected $_accessible = [
'duration' => true,
'cost' => true,
];
}
/* Commercials */
class Commercial extends Entity {
protected $_accessible = [
'info' => true,
'commercial_durations' => true,
];
}
/* CommercialDurations */
class CommercialDuration extends Entity {
protected $_accessible = [
'duration_id' => true,
'commercial_id' => true,
'quantity' => true,
'duration' => true,
'commercial' => true,
];
}
模型>表格:
class DurationsTable extends Table {
public function initialize(array $config)
{
$this->table('durations');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsToMany('Commercials', [
'through' => 'CommercialDurations',
]);
}
}
class CommercialsTable extends Table
{
public function initialize(array $config){
$this->table('commercials');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsToMany('Durations', [
'through' => 'CommercialDurations'
]);
$this->hasMany('CommercialDurations', [
'foreignKey' => 'commercial_id'
]);
}
}
class CommercialDurationsTable extends Table {
public function initialize(array $config)
{
$this->table('commercial_durations');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsTo('Durations', [
'foreignKey' => 'duration_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Commercials', [
'foreignKey' => 'commercial_id',
'joinType' => 'INNER'
]);
}
}
现在,我创建了一个新视图,我希望人们能够选择一个持续时间,输入数量并将该值添加到数据库中。我正在使用以下代码:
<?php
echo $this->Form->create($commercial);
echo $this->Form->input('durations._duration', ['options' => $durations]);
echo $this->Form->input('durations._joinData.quantity');
echo $this->Form->submit(__('Next'), ['class' => 'button small right', 'escape' => false]);
echo $this->Form->end()
?>
此表单的问题在于,持续时间选择未显示持续时间表中的“持续时间”字段,而是将该表中的所有字段(每行一个)显示为 JSON
<option value="0">{ "id": 1, "duration": "30 sec", "cost": 450 }</option>
提交表单后,我无法将此信息保存到 Commercials 对象或 CommercialDurations 中。这是我从 $this->request->data 对象得到的:
[
'durations' => [
'_duration' => '2',
'_joinData' => [
'quantity' => '2'
]
]
]
debug((string)$commercial) 在我开始表单之前的输出是:
/src/Template/Commercials/features.ctp (line 22)
'{
"id": 2,
"info": "AAAAAA ",
"created": "2015-04-16T21:48:48+0000",
"updated": null,
"durations": [],
}'
如何在表单上正确显示数据? 如何检索和保存这些数据?
谢谢!!
【问题讨论】:
-
请在调用
$this->Form->create($commercial)之前显示debug((string)$commercial)的结果 -
@JoséLorenzo 我将此信息添加到原始问题中。谢谢。
-
{ "id": 1, "duration": "30 sec", "cost": 450 }来自哪里?您的实体中没有任何关于durations的内容 -
我认为你是对的 @JoséLorenzo 而不是 'commercial_durations' => true,我添加了 'durations' => true, 。谢谢!我将在下面添加完整答案
标签: php forms cakephp cakephp-3.0