前提・実現したいこと
PHP(Cake3)で複数の配列データをDBに保存するため、saveManyで一括保存したいのですが
一番最後の配列データしか保存してくれません。
発生している問題・エラーメッセージ
とくにエラー等は発生していません。
saveManyを$resultにいれて内容をprしてみても、配列のすべてが入っています。
該当のソースコード
cakePHP3
1$data = [ 2 [ 3 'title' => '一番目の投稿', 4 'published' => 1 5 ], 6 [ 7 'title' => '二番目の投稿', 8 'published' => 1 9 ], 10]; 11 12// Prior to 3.6 use TableRegistry::get('Articles') 13$articles = TableRegistry::getTableLocator()->get('Articles'); 14$entities = $articles->newEntities($data); 15$result = $articles->saveMany($entities); 16
試したこと
補足情報(FW/ツールのバージョンなど)
DBはMySQLです。
saveMany後の $entities の中の各エンティティのエラーはどうなっていますか?DebugKitのVariablesで確認するか、各エンティティのgetErrors()メソッドを実行して確認してみてください。また、CakePHP 3.8以降を使用しているのであれば、saveManyOrFailメソッドを使用してみてください。
すみません、saveManyOrFailは3.9で追加予定のでした。とりあえず保存できていないエンティティのエラーを確認しましょう。
ご回答ありがとうございます。
$articles = TableRegistry::getTableLocator()->get('Articles');
$entities = $gmoCount->newEntities($data);
$result = $gmoCount->saveMany($entities);
$entities->getErrors();
pr($entities);
だと多分newEntities()なので、Call to a member function getErrors() on array in
とエラーが出てきてしまうので
foreachで配列を取得しました。
foreach ($data as $arr) {
$entities = $gmoCount->newEntity($arr);
$result = $gmoCount->save($entities);
$entities->getErrors();
pr($entities);
}
エラーは出ないのですが、やはり一番最後しか登録できません。
Cake\ORM\Entity Object
(
[title] => 一番目の投稿
[published] => 1
[[new]] =>
[[accessible]] => Array
(
[*] => 1
)
[[dirty]] => Array
(
)
[[original]] => Array
(
)
[[virtual]] => Array
(
)
[[hasErrors]] =>
[[errors]] => Array
(
)
[[invalid]] => Array
(
)
[[repository]] => data
)
Cake\ORM\Entity Object
(
[title] => 二番目の投稿
[published] => 1
[[new]] =>
[[accessible]] => Array
(
[*] => 1
)
[[dirty]] => Array
(
)
[[original]] => Array
(
)
[[virtual]] => Array
(
)
[[hasErrors]] =>
[[errors]] => Array
(
)
[[invalid]] => Array
(
)
[[repository]] => data
)
通常は下記で複数配列が保存されるんですよね?
$entities = $gmoCount->newEntities($data);
$result = $gmoCount->saveMany($entities);
foreach で回してsaveしている版でsaveOrFail()にしたらどうなりますか?
foreachで回して
$result = $gmoCount->saveOrFail($entities);
でも最後しか登録されませんでした。。変わらずです。。
もしかしてテーブルにプライマリキー振っていないとかですか?
テーブル定義も提示してください。
先ほどの$dataの中身はサンプルでしたが、本当は↓
CREATE TABLE `DATA` (
`SYORI_YM` varchar(6) NOT NULL DEFAULT '000000',
`SHOP_ID` varchar(15) NOT NULL,
`ISP_CODE` char(4) NOT NULL DEFAULT '',
`PEI_COUNT` int(8) DEFAULT '0',
PRIMARY KEY (`SYORI_YM`,`SHOP_ID`,`ISP_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=ujis
Modelの中身(DataTable.php)
<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Datasource\ConnectionManager;
class DataTable extends AppTable
{
/**
* DB Connection
*
* @var obj
*/
protected $_connection = null;
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->_connection = ConnectionManager::get('dbname');
$this->setConnection($this->_connection);
$this->setTable('DATA');
$this->setPrimaryKey('SYORI_YM','SHOP_ID','ISP_CODE');
}
}
プライマリーキーはふっています。
プライマリーキーが同じで、同じレコードへ保存しているのかなと思いましたが違いますか。
保存時に使用しているテーブルクラスのインスタンスが、実はDataTableのインスタンスではなかったというオチもあり得ますね。保存前に、get_class($gmoCount) でクラスを確認して本当に DataTable なのか確認してみるといいでしょう。
get_class、きちんとDataTableでした。
回答1件
あなたの回答
tips
プレビュー