2016-11-23 11 views
0

Я новичок в 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' 
    ]); 

Спасибо заранее!

ответ

0

Попробуйте сделать формат массива что-то вроде этого:

[ 
'customer_id' => '1', 
'items' => [ 
    'id' => 1, // this is primary key of items table 
    'item_quantity' => '18' // this is another field of items table 
    ] 
] 

И в вашем использовании метода редактирования прокомментировал строку:

$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]]); 
+0

Спасибо за ваш ответ. Когда я помещаю строку, которую вы упоминаете в контроллере, я получаю исключение «Невозможно упорядочить данные для ассоциации« QuoteItems ». Он не связан с «Цитатами». Кроме того, я удивлен тем, что cakePhp не может справиться с таким «базовым» сценарием, используя команду cake bake и что мне придется играть, чтобы изменить данные (я могу понять в разных сценариях, но это кажется основным). Хотя у cakephp есть много документации, это на самом деле не объясняется четко. – th3penguinwhisperer

+0

Забыл упомянуть: я вижу, что у вас есть идентификатор сразу под предметами. И item_quantity. Разве это не было вложенным в _joinData? У меня есть первичный ключ для соединения, поэтому я ожидаю, что это будет необходимо и в данных? заранее спасибо. – th3penguinwhisperer

+0

Ya, если таблицы находятся в правильных отношениях, которые работают без вложенных в _joinData. Я проверил его раньше и хорошо работает. –

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

  • Нет связанных вопросов^_^