• 締切済み

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を登録する方法をご教授願えませんでしょうか?

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

  • 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

  • カラム情報(主キー、データ型、桁数等)を取得するには

    テーブルに格納されているカラム情報(カラム名、主キー、データ型、データの桁数)を取得したいと考えています。 主キー情報とそれに付随するカラム情報は現在下記のSQL文で取得しています。 SELECT C.TABLE_NAME , COL.COLUMN_NAME, C.CONSTRAINT_TYPE, COL2.DATA_TYPE, COL2.DATA_LENGTH FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS COL, USER_TAB_COLUMNS COL2 WHERE C.TABLE_NAME = COL.TABLE_NAME AND C.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND C.TABLE_NAME = COL2.TABLE_NAME AND COL.COLUMN_NAME = COL2.COLUMN_NAME AND C.CONSTRAINT_TYPE = 'P' AND UPPER(C.TABLE_NAME) = UPPER('テーブル名') ORDER BY C.TABLE_NAME, COL.POSITION ここで、主キー以外のカラムに対しても同様にカラム情報を取得したいのですが、どのように取得すればよろしいでしょうか? ※カラム名、主キー有無、データ型、桁数 でカラム情報を取得できれば最も良いのですが、 主キー情報を除いた全体のカラム情報を取得する事ができれば、こちらの情報でも助かります 宜しくお願い致します。

  • MySQLでのテーブル作成

    MySQLでこういったテーブルを作成したのですが、 CREATE TABLE NOSGI ( GNRE_CD CHAR(5) NOT NULL, GNRE_NAME VARCHAR(20) NOT NULL, PRIMARY KEY (GNRE_CD) ); GNRE_CDはCHAR型で作成したのに、カラムの情報を見ると、 VARCHAR型にしまうのですが、どうしてでしょうか?

  • Oracleのcreate文で

    OracleのCreate文で、カラムに複数の制約を付ける方法を↓のサイトで見つけたのですが、 http://luna.gonna.jp/oracle/ora_const.html ちょっと、カラム名を変えたりして、このように↓書いてみたのですが、 create table Genereation_T ( Genereation_ID CHAR(3) not null, Genereation_Type VARCHAR2(10), Ins_dt DATE, Udp_dt DATE, Del_flg NUMBER(1), CONSTRAINT cons_p1 PRIMARY KEY(Genereation_ID), CONSTRAINT cons_u1 UNIQUE(Ins_dt), CONSTRAINT cons_f1 FOREIGN KEY(Udp_dt), REFERENCES Genereation_MASTER(Udp_dt), ); 「行10でエラーが発生し、キーワードがありません。」という表示がされます。 もう一個テーブルが必要なのでしょうか? エラー解消がわかる人お願いします。

  • PL/SQLでフィルタ後のテーブルを返す関数

    環境:Oracle81740 タイトル通りの質問ですが、、、 以下のテーブルがあったとします。 CREATE TABLE PUBLIC.TEST_TABLE ( KEY1 CHAR(20) NOT NULL, KEY2 CHAR(20) NOT NULL, VALUE1 VARCHAR2(256), CONSTRAINT GENERAL_TABLE_PK PRIMARY KEY (KEY1, KEY2) ) そこで本題ですが、 (構文がめちゃくちゃだとは思いますが、読み取ってください^^;) FUNCTION TEST_GET ( IN_KEY TEST_TABLE.KEY1%TYPE ) RETURN TABLE IS retTbl TABLE; というイメージで、[KEY1]値を受け取り、該当するレコードをテーブルとして返す関数を組みたいのですが、調べがつきません。 どなたかよろしくお願いいたします。

  • AUTO_INCREMENTのあるテーブルにinsertできません(長文)

    mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。

  • Oracleでテーブルを作成する際に、インデクスの作成先を指定したい。

    以下のようにテーブルを作成しようとしてます。 CREATE TABLE TEST_USER.M_USER ( ID char(4), NAME varchar2(40) NOT NULL), CONSTRAINT PK_USER PRIMARY KEY(ID) ); さて、プライマリキーを定義しているので、インデクスが作成されるはずです。 この作成先のテーブルスペースを指定したいのですが、方法が解りません。 CREATE TABLEの紹介をしているサイトにものっていなくて、途方にくれています・・・。 CONSTRAINT句を使えばいいのでしょうか?

  • SQLでのCASEの使い方

    ASPからSQLを実行し、DBを操作するプログラムを組んでいます。 SQLをクエリアナライザで実行したときに→のところでエラーが出るのですが、どのようにしたらいいでしょうか? ----------------------------------------------- if object_id('xxxx') is not null  drop procedure xxxx go CREATE PROCEDURE xxxx (  @client_id char(10),  @user_id  char(10),   :(省略)  @code_1  char(6) output,  @code_2  char(6) output,   :(省略)  @code_9  char(6) output ) AS BEGIN  SET NOCOUNT ON  BEGIN TRANSACTION    DECLARE @no     int  SELECT @no = '0'  WHILE (@no <= 9)  BEGIN   SELECT @AAA = ISNULL(MAX job_code), '000000')    FROM TABLE    WHERE client_id = @client_id     And user_id = @user_id    SET @AAA = dbo.fbx_NextAlphanumeric(@AAA)   :(省略)   :   CASE @no →正しくない構文    WHEN 0 THEN SELECT @code_1 = @AAA    WHEN 1 THEN SELECT @code_2 = @AAA →正しくない構文     :(省略)    WHEN 9 THEN SELECT @code_9 = @AAA   END   SELECT @no = @no + 1  END  COMMIT TRANSACTION  RETURN 1 END go ----------------------------------------------- やりたいのは、SQL実行後にOUTPUTする変数「@code_1~9」にWHILEでループしながら求めた変数@AAAをセットしたいのですが。 初歩的なことだとは思いますが、よろしくお願いします。

  • nativecode=ERROR: relation

    PostgreSQLについて質問なのですが、サーバ移転をしておりまして別のサーバにまったく同じ環境でDBを移行しました。 そこで、テーブルには接続できてまして他のテーブルに書き込んであるレコードは参照できるのですが別のテーブルに書き込もうとすると以下のようなメッセージがでてしまいます。 [db_error: message="DB Error: no such table" code=-18 mode=return level=notice prefix="" info="INSERT INTO tenpo (tenpo,towner,tiku,created,updated,disabled,password) VALUES ('1','test','0000000000','test',NULL,'test',NULL,NULL,'0','now()','now()',TRUE,'128573') [nativecode=ERROR: relation "public.tenpo_tenpo_no_seq" does not exist]"] no such tableと表示されていますがテーブルは存在してます。 テーブルに書かれているデフォルトの記載を削除するとメッセがかわります。 [db_error: message="DB Error: null value violates not-null constraint" code=-29 mode=return level=notice prefix="" info="INSERT INTO tenpo (tenpo,towner,tiku,created,updated,disabled,password)VALUES('1','test','0000000000','test',NULL,'test',NULL,NULL,'0','now()','now()',TRUE,'258237')[nativecode=ERROR: null value in column "tenpo_no" violates not-null constraint]"] 書き込みができない理由などのお知恵をお借りできればと思います。 よろしくお願いします。

  • SQLでTableが作れないlol

    show databases; と入力 自分のデータベースを use me; と入力 show tables;  と入力してからが問題なのですが・・・。 テーブルを作りたいのに、CREATEをしても作れないんですorz ↓↓入力した内容は以下のとおりです↓↓ CREATE TABLE cake ( code char(3), name varchar(10) NOT NULL, tanka char(8), from varchar(20) NOT NULL , drink varchar(10) NOT NULL , PRIMARY KEY (code) ); と、入力するとエラーで・・・ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from varchar(20) NOT NULL, drink varchar(10) NOT NULL, PRIMARY KEY (code) )' at line 5 と出てくるのですが、よくわかりません。 昨日までは作れていたのになぜかわからず質問してみました。 code char(3) , を code int(3), としてもできませんでした。 これから作業で使うので、困ってます><! ご回答のほどよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • PostgresSQLでテーブル定義の抽出方法

    create tableでテーブルを作成し、 comment on table でテーブルに名前を comment on column でアイテムに名前を つけてみました。 これらの作業の成果物を抽出したいのですが、どうやれば良いのでしょうか? \d テーブル名で Column、Type、Modifiersは確認できますが、 そうでなくて、別のデータベースにテーブルの枠だけをそのまま移植できるような形式で抽出できないでしょうか? create table tb1 ( item1 char(1) null ); comment on table is 'テーブル1'; comment on column is 'テーブル1のアイテム1'; みたいな状態で抜く事は可能でしょうか?

専門家に質問してみよう