Я новичок в CakePHP и использовал Cookbook CakePHP и stackoverflow, чтобы попытаться решить мою проблему, но не смог. Это, наверное, что-то глупое.CakePHP patchEntity не сохраняет данные (ассоциация «через»)
У меня есть котировки, товарные позиции и соединительные штучки с кодами QuotesItems.
У меня есть это в моем edit.ctp (шаблон) Котировки:
<div class="quotes form large-9 medium-8 columns content">
<?= $this->Form->create($quote) ?>
<fieldset>
<legend><?= __('Edit Quote') ?></legend>
<?php
echo $this->Form->input('customer_id', ['options' => $customers]);
echo $this->Form->input('items._ids', ['options' => $items]);
$counter = 0;
foreach($quote['items'] as $item):
echo $this->Form->input("items.$counter.description", array('disabled' => 'disabled'));
echo $this->Form->input("items.$counter._joinData.item_quantity");
$counter++;
endforeach
?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>
</div>
В QuotesController я для редактирования функции:
public function edit($id = null)
{
$quote = $this->Quotes->get($id, [
'contain' => ['Items']
]);
if ($this->request->is(['patch', 'post', 'put'])) {
$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['Quotes._joinData']);
//$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]]);
if ($this->Quotes->save($quote)) {
debug($this->request->data);
$this->Flash->success(__('The quote has been saved.'));
//return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The quote could not be saved. Please, try again.'));
}
}
$customers = $this->Quotes->Customers->find('list', ['limit' => 200]);
$items = $this->Quotes->Items->find('list', ['limit' => 200]);
$this->set(compact('quote', 'customers', 'items'));
$this->set('_serialize', ['quote']);
}
Массив передается при сохранении формы является:
[
'customer_id' => '1',
'items' => [
'_ids' => [
(int) 0 => '1'
],
(int) 0 => [
'_joinData' => [
'item_quantity' => '18'
]
]
]
]
Я проверил сохранение «Сохранение данных» поваренной книги, но не выяснил, что я делаю неправильно.
Нужны ли данным ID котировки? Является ли способ, которым я правильно повторяю эти пункты?
В таблице объединения производится следующим образом: Котировки:
$this->belongsToMany('Items', [
'through' => 'QuotesItems'
]);
товары:
$this->belongsToMany('Quotes', [
'through' => 'QuotesItems'
]);
QuotesItems (jointable):
$this->belongsTo('Quotes', [
'foreignKey' => 'quote_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Items', [
'foreignKey' => 'item_id',
'joinType' => 'INNER'
]);
Спасибо заранее!
Спасибо за ваш ответ. Когда я помещаю строку, которую вы упоминаете в контроллере, я получаю исключение «Невозможно упорядочить данные для ассоциации« QuoteItems ». Он не связан с «Цитатами». Кроме того, я удивлен тем, что cakePhp не может справиться с таким «базовым» сценарием, используя команду cake bake и что мне придется играть, чтобы изменить данные (я могу понять в разных сценариях, но это кажется основным). Хотя у cakephp есть много документации, это на самом деле не объясняется четко. – th3penguinwhisperer
Забыл упомянуть: я вижу, что у вас есть идентификатор сразу под предметами. И item_quantity. Разве это не было вложенным в _joinData? У меня есть первичный ключ для соединения, поэтому я ожидаю, что это будет необходимо и в данных? заранее спасибо. – th3penguinwhisperer
Ya, если таблицы находятся в правильных отношениях, которые работают без вложенных в _joinData. Я проверил его раньше и хорошо работает. –