2015-12-15 75 views
0

Cake PHP Version: 3.1.5CakePHP的3:hasOne關聯沒有得到保存/創建

我有一個問題,節省了hasOne協會,在一個表上工作正常,但不與第二。

TicketsCashdraftsCashpositions在屬於關係。 Cashpositions爲他們的身份證持有兩個FK。因此,當一個新的cashposition是自動創建它擁有要麼一個ticket_id一個cashdraft_id。第二個FK將爲空。

的事情是,該門票,Cashpositions節能工作正常,所以每次一票時,就產生了相關cashposition。但它不適用於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')); 
     } 
    } 
} 

調試的$票和$ cashdraft。但我不能說我理解的輸出,因爲:

的數組中票將顯示每一個相關的數據,但沒有cashposition,雖然它的新記錄已成功創建...

和數組新在沒有建立相關的cashposition cashdraft會這個樣子,說「空」吧:

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' 

}

SQL在DebugKit我可以看到,對於ticke INSERT到相關的地址表中就完成了。但對於cashdrafts沒有INSERT完成到相關表。所以顯然Cake甚至不嘗試創建關聯的記錄。

我真的出出主意吧!在數據庫本身中,兩個FK的設置完全一樣,名稱也是正確的。

有沒有人知道問題可能出在哪裏,或者我可以在哪裏進一步搜索第二個關聯不起作用的原因?謝謝!

+0

是否使用'蛋糕PHP版本:你說的1.3.5',還是你標記的cakephp-3.0? – Tsumannai

+0

哦,對不起,我沒有看到我在那裏切換數字,我會糾正這一點。我使用版本3.1.5。 – eve

回答

2

好了,所以尋找一個萬小時,我終於明白,這個問題是不是與模型或控制器像我想以後。 (僅)視圖和請求數據不完整。 不知何故,我認爲如果不存在,即使沒有輸入,它也會奇蹟般地爲實體添加關聯;)

在保存工作的票據表中,我有一個空的輸入字段那不再存在了,我只是還沒有刪除它,但它做了詭計(不要問我爲什麼)。

現在要解決它,我只是把一個隱藏的輸入字段在爲保持爲空,這兩個表的add.ctp視圖的關聯cashposition.ticket_idcashposition.cashdraft_id。現在請求數據包含關聯數組,並且每次添加新票證或cashdraft時自動創建一個具有匹配FK的新地址。

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

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

因爲我只是一個初學者有了這個,我不知道這是否是最好的一段路要走,但它的作品(終於?)