2015-12-15 2 views
0

Cake PHP Version: 3.1.5CakePHP 3: hasOne объединение не получает сохранены/создано

У меня есть проблема с сохранением в hasOne ассоциации, которая прекрасно работает на одном столе, но не со вторым.

Tickets и Cashdrafts связанные с Cashpositions в имеют отношение к отношениям. Cashpositions имеет два FK для своего идентификатора. Поэтому, когда новое создание кассы автоматически создается, оно содержит либо a ticket_idили a cashdraft_id. Второй FK будет нулевым.

Дело в том, что сохранение билетов-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')); 
     } 
    } 
} 

Я отлажена за $ билет и $ cashdraft. Но я не могу сказать, что я понимаю выход, потому что:

Решетки для билета будет показывать каждые соответствующие данные, но не cashposition, хотя новый рекорд для этого был успешно создан ...

и массив для нового cashdraft, где соответствующий cashposition не создается будет выглядеть, как это и сказать, «нулевой» для него:

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 t INSERT в соответствующую таблицу cashpositions. Но для cashdrafts нет INSERT, сделанного в связанной таблице. Поэтому, очевидно, Cake даже не пытается создать связанную запись.

У меня действительно нет идей! В самой базе данных оба FK настроены точно так же, имена верны и т. Д.

Есть ли у кого-нибудь представление о том, что может быть проблемой, или где я мог бы продолжить поиск причины, по которой вторая ассоциация не работает? Спасибо!

+0

Вы используете 'Cake PHP версии: 1.3.5', который вы указали, или cakephp-3.0, который вы отметили? – Tsumannai

+0

О, извините, я не видел, что я переключил номера там, я исправлю это. Я использую версию 3.1.5. – eve

ответ

2

Итак, после поиска миллиона часов я наконец понял, что проблема не в том, что у модели или контроллера, как я думал. Это было (просто) представление и данные запроса не были завершены. Как-то я подумал, что Cake волшебным образом добавит сущность для ассоциации, если она не существует, даже если для нее нет данных;)

В таблице билетов, для которой было выполнено сохранение, у меня было пустое поле ввода для столбца в Cashpositions это уже не существует, и я просто еще не удалил его, но он сделал трюк (не спрашивайте меня почему).

Чтобы исправить это сейчас я просто положить в поле в скрытый ввода для ассоциации cashposition.ticket_id и cashposition.cashdraft_id в представлении add.ctp для обеих таблиц, остается пустым. Теперь данные запроса содержат массив для ассоциации и автоматически создают новый кассовый с соответствующим FK каждый раз, когда добавляется новый билет или кассовый чек.

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

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

Поскольку я просто новичок в этом я не знаю, если это лучший способ пойти, но он работает (в конце концов ...)

Смежные вопросы