CakePHP 3: ассоциация hasOne не сохраняется / создается

Cake PHP Version: 3.1.5

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

Tickets а также Cashdrafts связаны с Cashpositions в отношениях. Cashpositions держит два FK для их ID. Поэтому, когда автоматически создается новая денежная позиция, она содержит ticket_id или 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'));
        }
    }
}

Я отладил $ билет и $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 я вижу, что для тикета делается INSERT в таблицу связанных денежных позиций. Но для кассовых чеков INSERT не делается в соответствующей таблице. Очевидно, что Cake даже не пытается создать связанную запись.

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

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

1 ответ

Итак, после поиска в течение миллиона часов я наконец понял, что проблема не в модели или контроллере, как я думал. Это было (просто) представление и данные запроса не были завершены. Каким-то образом я думал, что 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'
        ]) ?>

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

Другие вопросы по тегам