2015-10-02 6 views
4

У меня труднее всего сэкономить несколько записей. Я пробовал миллион вещей, но в итоге у меня одна и та же проблема: мои записи не сохраняются, и я не вижу никаких ошибок. Имейте в виду, что я новичок в cakephp и новичок-кодер.cakephp 3.x сохранение нескольких объектов - newEntities

Я пропустил что-то очевидное и важное?

Таблица:

$this->table('splits'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 

    $this->belongsTo('Transactions', [ 
     'foreignKey' => 'transaction_id', 
     'joinType' => 'INNER' 
    ]); 
    $this->belongsTo('Accounts', [ 
     'foreignKey' => 'account_credit_id', 
     'joinType' => 'INNER' 
    ]); 

Контроллер:

$splits = $this->Splits->newEntity(); 
    if ($this->request->is('post')) { 
     $splits = $this->Splits->newEntities($this->request->data()); 

     debug($splits); 

     foreach ($splits as $split){ 
      $this->Splits->save($split); 
     } 
    } 

    $transactions = $this->Splits->Transactions->find('list', ['limit' => 200]); 
    $accounts = $this->Splits->Accounts->find('list', ['limit' => 200]); 
    $this->set(compact('split', 'transactions', 'accounts')); 
    $this->set('_serialize', ['split']); 

шаблона:

 echo $this->Form->input('Splits.1.transaction_id', ['options' => $transactions]); 
     echo $this->Form->input('Splits.1.amount', ['type' => 'float']); 
     echo $this->Form->input('Splits.1.account_id', ['options' => $accounts]); 
     echo $this->Form->input('Splits.2.transaction_id', ['options' => $transactions]); 
     echo $this->Form->input('Splits.2.amount', ['type' => 'float']); 
     echo $this->Form->input('Splits.2.account_id', ['options' => $accounts]); 
     echo $this->Form->input('Splits.3.transaction_id', ['options' => $transactions]); 
     echo $this->Form->input('Splits.3.amount', ['type' => 'float']); 
     echo $this->Form->input('Splits.3.account_id', ['options' => $accounts]); 

Debug на $ расщепляется:

[ 
(int) 0 => object(App\Model\Entity\Split) { 

    (int) 1 => [ 
     'transaction_id' => '108', 
     'amount' => '100.33', 
     'account_id' => '2' 
    ], 
    (int) 2 => [ 
     'transaction_id' => '108', 
     'amount' => '50.22', 
     'account_id' => '4' 
    ], 
    (int) 3 => [ 
     'transaction_id' => '108', 
     'amount' => '65.22', 
     'account_id' => '5' 
    ], 
    '[new]' => true, 
    '[accessible]' => [ 
     '*' => true 
    ], 
    '[dirty]' => [ 
     (int) 1 => true, 
     (int) 2 => true, 
     (int) 3 => true 
    ], 
    '[original]' => [], 
    '[virtual]' => [], 
    '[errors]' => [], 
    '[repository]' => 'Splits' 

} 
] 
+0

Данные не вставляются в таблицу вправо? –

+0

Замените SaveAll вместо сохранения в контроллере. –

+0

@KarthikKeyan Нет 'saveAll()' в CakePHP 3.x – ndm

ответ

5

ли вы где-нибудь видели этот Table.index.field стиль используется, или вы просто пытались что-то и надеялся, что это будет работать?

При сохранении много записей соответственно создание многих объектов, ожидаемый формат является численно индексированный массив, который содержит данные для отдельных записей, так же, как показано в документации

Cookbook > Database Access & ORM > Saving Data > Converting Multiple Records

Когда создавая формы, которые создают/обновляют сразу несколько записей, может использовать newEntities():

[...]

В этой ситуации данные запроса для нескольких статей должны выглядеть как:

$data = [ 
    [ 
     'title' => 'First post', 
     'published' => 1 
    ], 
    [ 
     'title' => 'Second post', 
     'published' => 1 
    ], 
]; 

Так что ваши входы не должны использовать имя таблицы, но только индекс и имя поля, как

echo $this->Form->input('0.transaction_id', /* ... */); 
echo $this->Form->input('0.amount', /* ... */); 
echo $this->Form->input('0.account_id', /* ... */); 
echo $this->Form->input('1.transaction_id', /* ... */); 
echo $this->Form->input('1.amount', /* ... */); 
echo $this->Form->input('1.account_id', /* ... */); 
echo $this->Form->input('2.transaction_id', /* ... */); 
echo $this->Form->input('2.amount', /* ... */); 
echo $this->Form->input('3.account_id', /* ... */); 
+0

NDM: Я видел где-то синтаксис Table.index.field. Я думаю, что меня повесили на ошибки проверки, когда я должен был уделять больше внимания правильному форматированию данных. Спасибо за вашу помощь. – cKelly

0

Попробуйте этот пример, чтобы вставить несколько recored в cakphp 3.x

$passwords = $this->request->data('password_id'); 
foreach ($passwords as $password) { 
$data = [ 
    'event_id' => $this->request->data('event_id'), 
    'password_id' => $password 
]; 
$eventPasswordAll = $this->EventPasswordAll->newEntity(); 
$this->EventPasswordAll->patchEntity($eventPasswordAll, $data); 
$this->EventPasswordAll->save($eventPasswordAll);} 

Я надеюсь, что это полезно для вашего вопроса

пожалуйста reviwe это, спасибо!

+0

Возможно, он хочет безошибочного решения. –

1

Попробуйте это:

$splits = TableRegistry::get('splits'); 

$entities = $splits->newEntities($this->request->data()); 

foreach ($entities as $entity) { 
    $splits->save($entity); 
} 
+0

Возможно, он хочет, чтобы решение без петли, как в более ранней версии CakePHP, имело метод SaveAll() ... –

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