1

本当に奇妙な問題についてはすでに多くのフォーラムを検索しましたが、保存プロセス中に何が問題になっているのかまだわかりません...データベースで。

環境

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" を実行して新しいレコードを追加すると、すべて正常に機能します。

他のコントローラーからレコードを保存できません。私はすでにこの問題を解決して大きな頭痛を抱えているので、解決策のヒントをいただければ幸いです!!

よろしくお願いします!

4

1 に答える 1