CakePHP 3:没有保存/创建hasOne关联

时间:2015-12-15 13:09:16

标签: php mysql cakephp-3.1

Cake PHP Version: 3.1.5

我在保存 hasOne 关联时出现问题,该关联在一个表上正常工作但在第二个表上没有。

TicketsCashdrafts与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设置完全相同,名称正确等等。

是否有人知道问题可能是什么,或者我可以在哪里进一步搜索第二个关联无效的原因?谢谢!

1 个答案:

答案 0 :(得分:2)

好的,所以在搜索了一百万个小时之后我终于意识到,问题不在于模型或控制器,就像我想的那样。 (仅)视图和请求数据不完整。 不知何故,我认为如果不存在,即使没有输入,Cake也会神奇地为关联添加实体;)

在保存工作的故障单表格中,我在Cashpositions中的一个列的空输入字段已经不再存在了,我还没有删除它,但是它确实可以解决这个问题(不要&&#39)不要问我为什么。

要解决此问题,我现在只需为add.ctp视图中的关联cashposition.ticket_idcashposition.cashdraft_id添加一个隐藏输入字段,这两个表都保持为空。现在,请求数据包含关联的数组,并且每次添加新的票证或现金时,auto都会使用匹配的FK自动创建新的cashposition。

<!-- Cashdrafts/add.ctp -->

<?php echo $this->Form->input(
        'cashposition.cashdraft_id', [
                'label' => false,
                'type' => 'hidden'
        ]) ?>

由于我只是一个初学者,我不知道这是不是最好的方法,但它有效(最后......)