• 締切済み

CakePHP3 belongsTo NULL登録

CakePHP3.0 を使用して、顧客情報を登録するアプリケーションを作成しています。 顧客情報には言語カラムがあり、外部の言語テーブルのコードを参照しています。 顧客情報の言語カラムはNULLを許容します。 DB [Table] client_entities | language_code1 | char(2) | NULL YES | MUL | | language_code2 | char(2) | NULL YES | MUL | | language_code3 | char(2) | NULL YES | MUL | | language_code4 | char(2) | NULL YES | MUL | | language_code5 | char(2) | NULL YES | MUL | | language_code6 | char(2) | NULL YES | MUL | [Table] languages | id | int(11) | NULL NO | PRI | | code | char(2) | NULL NO | UNI | CakePHPでは、Tableにアソシエーションの定義を追加しました。 (Controllerのindex()にも設定を追加していますが、edit()、update()は未変更です) ClientEntitiesTable public function initialize(array $config) { $this->belongsTo('Languages', [ 'foreignKey' => 'language_code1', 'bindingKey' => 'code', 'joinType' => 'LEFT' ]); ..... continue } LanguagesTable public function initialize(array $config) { $this->hasMany('ClientEntities', [ 'foreignKey' => 'language_code1', 'bindingKey' => 'code' ]); ..... continue } この状態で、顧客情報の登録・更新処理において、言語カラム未設定でsubmitすると、 NULLの状態で送られた情報が内部で空文字''に変換されてしまいDBの参照整合性エラーが発生してしまいます。 Error情報 Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`cir`.`client_entities`, CONSTRAINT `client_entities_ibfk_7` FOREIGN KEY (`language_code2`) REFERENCES `languages` (`code`)) UPDATE client_entities SET language_code2 = :c0 WHERE id = :c1 解決方法として、TableクラスのbeforeSave()メソッドを内で空文字をNULLへ変換する処理を追加したのですが、 別のエラーが発生してしまいます。 Undefined variable: _SESSION [CORE\src\Network\Session.php, line 440] どなたか、CakePHPにて外部参照制約のついているカラムへNULLを登録する方法をご教授願えませんでしょうか?

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

cakephp2までしか知らないけど、SQLSTATE[23000]: ってPDO接続先のMySQL が出してるエラーですよね。 MySQLの外部キー制約に ON UPDATE CASCADEつけて、複数カラムから参照先テーブルの同一カラムを foreign key参照すると、insertやupdateの時に提示のようなエラーがでたと記憶しています。 https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html MySQL側のテーブル定義には、foreign key条項は入れずに、cakephp側belongsTo定義だけで制御するなら問題ないと思いますけど?。 cakephp3 での変更点はよく知らないけど、cakephp2 までなら、save用データの連想配列キーをunset すれば、そのカラムは、insert時の対象カラムにならないからnullが入るはず。

関連するQ&A

専門家に質問してみよう