質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

436閲覧

CakePHP4のsaveメソッドはプライマリキー違反を検出しないのか

yamano2023

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2023/08/24 11:55

実現したいこと

MySQLのテーブルに登録時に、既に登録されているプライマリキーの場合、上書きされないようにしたい。

前提

CakePHP4.4.15
Amazon Linux2
Apache
Amaon RDS (MySQL community8.0.33)

以上の環境でWEBアプリを稼働させようとしています。

発生している問題・エラーメッセージ

Customersというテーブルを作成し、
プライマリキーにidというカラムを指定。

id 1000000001
が既にDBに存在する場合に、
newEmptyEntityを使用したcustomerエンティティーに、
同じID1000000001
を入れてsaveすると、
後から入力した情報で上書きされてしまう。

これが正しい動きなんでしょうか。
プライマリキー違反でエラーになって欲しいんですが。

該当のソースコード

$customer = $this->Customers->newEmptyEntity();
$customer->id = '1000000001';
&customer->name = 'bbb';
$customer->isNew(); // この時点でtrue
$this->Customers->save(&customer);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

私はほとんどtableクラスのORMは使わないので気にならなかったのですけど
少し調べてみました。
xdebugなどで動きをみると、isNew()がtrueであっても、存在チェックを行って存在していたら更新に切り替えています

Cookbookに次のようにありますが、こういう仕様であるなら読み取りにくいように感じますね

もし isNew() が真を返し、エンティティーが主キー値を持っていれば、 'exists' クエリーが発行されます。 'exists' クエリーは $options 引数に 'checkExisting' => false を渡すことで抑制することができます。

https://book.cakephp.org/4/ja/orm/saving-data.html#saving-entities

以下のようにすると、新規の時は重複チェックをせずにそのまま実行し
(キー重複があれば)例外が発生すると思います

php

1try{ 2 $this->Customers->save( 3 $customer, 4 ($customer->isNew()? ['checkExisting' => false] : [] ) 5 ); 6}catch(\Exeption $e){ 7}

投稿2023/08/29 16:22

hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問