我正在尝试使用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()
?>
这种形式的问题是,持续时间选择没有显示“#”持续时间&#39;来自Durations表的字段,而是显示该表中的所有字段(每行一个)为JSON
<option value="0">{ "id": 1, "duration": "30 sec", "cost": 450 }</option>
提交表单后,我无法将此信息保存到Commercials对象或CommercialDurations中。这是我从$ this-&gt; request-&gt;数据对象获得的:
[
'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": [],
}'
如何在表单上正确显示数据? 如何检索和保存这些数据?
谢谢!
答案 0 :(得分:0)
我没有获得您的模特关系,因为根据您的帖子,持续时间属于商业广告,商业广告属于持续时间。
为了解释您应该如何发送请求以及表单的外观,我们假设您的模型是这样的:
您的商业广告具有商业广告时段,此商业广告时长属于
所以你的模型看起来像这样:
商业有很多商业时间。
商业时间属于商业广告。
商业时间属于持续时间。
持续时间有很多商业时间。
你的添加功能应该是这样的(假设你没有保存新的持续时间,只是商业和商业时间)
$commercial = $this->Commercials->newEntity($this->request->data,[
'associated' => ['Commercialdurations']
]);
if ($this->Commercials->save($commercial)) {
$success = true;
}else{
$success = false;
}
请求数据应如下所示:
{
"commercialdurations":{
"Commercialduration":{
"duration_id":"1",
"quantity":"1",
"duration":"1"
}
},
"info":"something"
}
基本上,您发送新商业(信息)的数据以及与此相关的商业持续时间(您可以发送多个商业持续时间)。
要使表单显示持续时间,基本上您必须在控制器中序列化此信息,转到添加操作并添加此操作。 (你可以使用你想要检索的数据,重要的是你将它发送回视图)
$durations = $this->Commercials->Commercialdurations->Durations->find('list', ['limit' => 200]);
$this->set(compact('commercial',durations'));
$this->set('_serialize', ['commercial']);
然后在您的表单中,您可以使用数据
echo $ this-&gt; Form-&gt; input(&#39; duration_id&#39;,[&#39; options&#39; =&gt; $ durations]);
所以你的表格看起来像这样:
echo $this->Form->input('info');
echo $this->Form->input('commercials.Commercial.duration_id', ['options' => $durations]);
echo $this->Form->input('commercials.Commercial.quantity');
echo $this->Form->input('commercials.Commercial.duration');
基本上,您希望发送包含所有关联数据级别的请求。
有关保存相关数据的指导,请参阅此其他问题:
Cake PhP 3 Saving associated data in multiples levels
要了解有关如何构建表单的更多信息:
http://book.cakephp.org/3.0/en/views/helpers/form.html#creating-inputs-for-associated-data