CakePHP3.6で、下記のようなシェルの処理を作成しています。
$type の値によって、insertか、insert on duplicate key updateか、を振り分けています。
この処理で、データベースへの保存処理でエラーとなった場合でも例外処理が実行されないのですが、なぜなのか分かりませんでしょうか?
エラーは、「count」が「int(11)」なのに文字列を保存しようとしているエラーになります。
Controllerでは動作しているであろう処理(※)をコピペして下記のソースを書いているのですが、shellとでは書き方が違うのでしょうか?
※稼働中のシステムの処理ですが、エラー時に例外処理が実行されるのかは不明な処理。
また、いろいろ試している中で
} catch (\Cake\ORM\Exception\PersistenceFailedException $e) {
の記述を
} catch (\Exception $e) {
} catch (Exception $e) {
に変えると、例外処理が実行されました。
\Cake\ORM\Exception\PersistenceFailedException
では、データの保存時のエラーの例外は取得できないのでしょうか?
php
1<?php 2namespace App\Shell; 3 4use Cake\Console\ConsoleOptionParser; 5use Cake\ORM\TableRegistry; 6use Cake\Datasource\ConnectionManager; 7 8class GetTestsShell extends Shell{ 9 10 : 11 省略 12 : 13 14 // テーブルのオブジェクトを取得 15 $tableObject = TableRegistry::get("tests"); 16 $tableObjectConnection = ConnectionManager::get("default"); 17 18 $sql = "INSERT INTO tests ( title, count, created, modified ) value ( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE title = ?, count = ?, created = ?, modified = ?"; 19 $data = ["aaa", "bbb", "2019-01-01", "2019-01-01"]; 20 21 $toData = [ 22 title => $data[0], 23 count => $data[1], 24 created => $data[2], 25 modified => $data[3], 26 ]; 27 28 if ( $type = 1 ) { 29 $saveData = $tableObject->newEntity($toData); 30 try { 31 $tableObject->saveOrFail($saveData); 32 } catch (\Cake\ORM\Exception\PersistenceFailedException $e) { 33 echo $e; 34 echo $e->getEntity(); 35 } 36 } else { 37 try { 38 $tableObjectConnection->execute($sql,$data); 39 } catch (\Cake\ORM\Exception\PersistenceFailedException $e) { 40 echo $e; 41 echo $e->getEntity(); 42 } 43 } 44 45 : 46 省略 47 :
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。