cakephp 3.x сохранение нескольких сущностей - Новые сущности


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

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

Таблица:

    $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]);

Отладка на $splits:

[
(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'

}
]
Author: cKelly, 2015-10-02

4 answers

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

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

Кулинарная книга > Доступ к базе данных и ORM > Сохранение данных > Преобразование нескольких записей

При создании форм, которые создают/обновляют несколько записей сразу же вы можете использовать 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', /* ... */);
 5
Author: ndm, 2015-10-03 15:22:12

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

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

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

foreach ($entities as $entity) {
    $splits->save($entity);
}
 1
Author: Rana, 2015-10-05 03:36:30

Попробуйте в этом примере вставить несколько записей в 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 );}

Надеюсь, это будет полезно для вашего вопроса

Пожалуйста, обновите его, спасибо!

 0
Author: Karthik Keyan, 2015-10-03 06:27:47

Если вы хотите обработать все сущности как одну транзакцию, вы можете использовать transactional():

Несмотря на использование цикла, "транзакции" позволяют избежать ошибок, если "сохранить" не работает.

    // In a controller.
    $articles->getConnection()->transactional(function () use ($articles, $entities) {
        foreach ($entities as $entity) {
            $articles->save($entity, ['atomic' => false]);
        }
    });

Преобразование нескольких записей - CakePHP 3

 0
Author: Temístocles Arêa, 2018-04-20 12:49:48