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 установлены одинаково, имена правильные и т. Д.

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

0

Решение

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

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

2

Другие решения

Других решений пока нет …