Cake PHP Version: 3.1.5
我在保存 hasOne 关联时出现问题,该关联在一个表上正常工作但在第二个表上没有。
Tickets
和Cashdrafts
与belongsTo关系中的Cashpositions
相关。 Cashpositions持有两个FK作为他们的身份证。因此,当自动创建新的cashposition时,它 ticket_id
或 a cashdraft_id
。第二个FK将为空。
问题是,Tickets-Cashpositions保存工作正常,因此每次创建故障单时都会创建相关的现金出现。但它不适用于Cashdrafts-Cashpositions。我不明白为什么,因为设置和关系完全一样。
以下是设置:
class CashpositionsTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Tickets', [
'foreignKey' => 'ticket_id'
]);
$this->belongsTo('Cashdrafts', [
'foreignKey' => 'cashdraft_id'
]);
}
}
class TicketsTable extends Table
{
public function initialize(array $config)
{
$this->hasOne('Cashpositions', [
'foreignKey' => 'ticket_id'
]);
}
}
class CashdraftsTable extends Table
{
public function initialize(array $config)
{
$this->hasOne('Cashpositions', [
'foreignKey' => 'cashdraft_id'
]);
}
}
然后在控制器中添加()函数:
class TicketsController extends AppController
{
public function add($memberId = null)
{
$ticket = $this->Tickets->newEntity();
if ($this->request->is('post')) {
$ticket = $this->Tickets->patchEntity($ticket, $this->request->data, [
// working fine: creates new cashposition for this ticket
'associated' => ['Cashpositions']
]);
if ($this->Tickets->save($ticket)) {
$this->Flash->success(__('ticket saved'));
return $this->redirect(['action' => 'view', $ticket->$id]);
} else {
$this->Flash->error(__('ticket could not be saved'));
}
}
class CashdraftsController extends AppController
{
public function add()
{
$cashdraft = $this->Cashdrafts->newEntity();
if ($this->request->is('post')) {
$cashdraft = $this->Cashdrafts->patchEntity($cashdraft, $this->request->data,[
// fail: no associated record created
'associated' => ['Cashpositions']
]);
if ($this->Cashdrafts->save($cashdraft)) {
$this->Flash->success(__('cashdraft saved.'));
return $this->redirect(['action' => 'view', $cashdraft->id]);
} else {
$this->Flash->error(__('cashdraft could not be saved'));
}
}
}
我调试 $ ticket和$ cashdraft。但我不能说我理解输出因为:
故障单的数组将显示每个相关数据,但没有现金,尽管已成功创建新记录...
未创建相关现金出现的新现金存档的数组将如下所示,并说" null"为它:
object(App\Model\Entity\Cashdraft) {
'id' => (int) 10,
'amount' => (float) -7,
'created' => object(Cake\I18n\Time) {
'time' => '2015-12-13T20:03:54+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'modified' => object(Cake\I18n\Time) {
'time' => '2015-12-13T20:03:54+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'cashposition' => null, // this part not even showing up for a "ticket" in the debug
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Cashdrafts'
}
在DebugKit的 SQL 中,我可以看到,对于故障单,INSERT进入相关的cashpositions表已完成。但对于cashdrafts,相关表格中没有INSERT。很明显,Cake甚至没有尝试创建相关记录。
我现在真的没想法了!在数据库本身中,两个FK设置完全相同,名称正确等等。
是否有人知道问题可能是什么,或者我可以在哪里进一步搜索第二个关联无效的原因?谢谢!
答案 0 :(得分:2)
好的,所以在搜索了一百万个小时之后我终于意识到,问题不在于模型或控制器,就像我想的那样。 (仅)视图和请求数据不完整。 不知何故,我认为如果不存在,即使没有输入,Cake也会神奇地为关联添加实体;)
在保存工作的故障单表格中,我在Cashpositions中的一个列的空输入字段已经不再存在了,我还没有删除它,但是它确实可以解决这个问题(不要&&#39)不要问我为什么。
要解决此问题,我现在只需为add.ctp视图中的关联cashposition.ticket_id
和cashposition.cashdraft_id
添加一个隐藏输入字段,这两个表都保持为空。现在,请求数据包含关联的数组,并且每次添加新的票证或现金时,auto都会使用匹配的FK自动创建新的cashposition。
<!-- Cashdrafts/add.ctp -->
<?php echo $this->Form->input(
'cashposition.cashdraft_id', [
'label' => false,
'type' => 'hidden'
]) ?>
由于我只是一个初学者,我不知道这是不是最好的方法,但它有效(最后......)