本当に奇妙な問題についてはすでに多くのフォーラムを検索しましたが、保存プロセス中に何が問題になっているのかまだわかりません...データベースで。
環境
Cake-1.3.13 アプリをしばらく実行していて、別のデータベース テーブルを追加する必要がありました。これはもちろん他のテーブルに関連しています。私の問題は、habtm-relation テーブルのレコードを保存することです。これは次のようになります。
CREATE TABLE IF NOT EXISTS `employees_projects_rejectreasons` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`employees_project_id` int(10) unsigned NOT NULL,
`rejectreason_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `employees_project_id` (`employees_project_id`,`rejectreason_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;
基本的な検証基準のみを使用して単純なモデルを足場にしました。
<?php
class EmployeesProjectsRejectreason extends AppModel {
var $name = 'EmployeesProjectsRejectreason';
var $validate = array(
'employees_project_id' => array(
'numeric' => array(
'rule' => array('numeric'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
'rejectreason_id' => array(
'numeric' => array(
'rule' => array('numeric'),
//'message' => 'Your custom message here',
//'allowEmpty' => false,
//'required' => false,
//'last' => false, // Stop validation after this rule
//'on' => 'create', // Limit validation to 'create' or 'update' operations
),
),
);
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $belongsTo = array(
'EmployeesProject' => array(
'className' => 'EmployeesProject',
'foreignKey' => 'employees_project_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Rejectreason' => array(
'className' => 'Rejectreason',
'foreignKey' => 'rejectreason_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
Rejectreasons と EmployeesProjects のレコードをいくつか作成したので、データベースには有効なエントリがいくつかあります。ここで、指定された employees_projects_rejectreasons テーブルに新しいレコードを作成して、それらをリンクしたいと考えています。別のコントローラー (EmployeesProjectsController) からこれを実行しようとしました。データを保存するための私の最新の試みは次のとおりです。
$this->EmployeesProject->EmployeesProjectsRejectreason->create();
$eprData = array(
'EmployeesProjectsRejectreason' => array(
'employees_project_id' => (int)$id,
'rejectreason_id' => (int)$rrId
)
);
if($this->EmployeesProject->EmployeesProjectsRejectreason->save($eprData)) {
debug('successfully saved EPR with ID '.$this->EmployeesProject->EmployeesProjectsRejectreason->__insertID);
} else {
debug('could not save EPR with employees_project_id='.$id.' and rejectreason_id='.$rrId);
}
さてどうなるか
レコードを保存しようとすると、デバッグで次の成功レポートが表示されます。
successfully saved EPR with ID 4
したがって、save() 呼び出しは true を返し、mySQL の auto_increment 関数によって新しい ID が作成されました。ここまでは順調ですね。しかし、データベースを確認すると、レコードが作成されていませんでした。しかし、auto_increment_counter は、あたかもレコードが保存されたかのように 1 増加しましたが、そうではありませんでした。
デバッグ レベル 2 でアプリを実行すると、cake から生成された SQL ステートメントを確認できます。
INSERT INTO `employees_projects_rejectreasons` (`employees_project_id`, `rejectreason_id`) VALUES (3, 3)
このステートメントを SQL サーバーで直接実行すると、レコードは正しく挿入されません。
私がすでに試したこと
保存手順ですでにさまざまなアプローチを試しました。データ配列の代わりにセッターを使用してみました:
$this->EmployeesProject->EmployeesProjectsRejectreason->set('employees_project_id', $id);
も同様ですが、違いはありませんでした。EmployeesProjectsRejectreason-Modelにカスタムの save-method を記述した後、コントローラーから呼び出しましたが、常に同じ結果が得られました。
私は試した
- モデルキャッシュの削除
- サーバーインスタンスとサーバー自体の再起動
- テーブルの削除と再作成
- モデルの検証を無効にする
- 一意の外部キー インデックスの削除
- ハードコーディングされた既存の ID を外部キーとして保存する
いくつかのより奇妙な動作
コントローラ コードにハードコードされた ID を使用した最後のテストでは、さらなる謎に直面しました。既存のforeign_key-ID を保存しようとすると、データが以前のように保存されません。しかし、両方の ID がハードコードされていて、存在しない場合 (データベースには明らかに存在しない発明された ID 345 と 567 を使用しました)、最終的にレコードが挿入されました!
さらに、新しいテーブルのモデル、ビュー、およびコントローラーを足場にしました。スキャフォールディング ビュー "myApp/employees_projects_rejectreasons/add" を実行して新しいレコードを追加すると、すべて正常に機能します。
他のコントローラーからレコードを保存できません。私はすでにこの問題を解決して大きな頭痛を抱えているので、解決策のヒントをいただければ幸いです!!
よろしくお願いします!