2

親子の自己関連付けテーブルがあります。id=parent_idの場合、そのIDはそれ自身の親です。ただし、アクション/ビューの追加からテーブルにデータを保存するのに問題があります

add.ctpビューから-新しいレコードを追加するときに、ドロップダウンボックスからparent_idを選択し、名前を入力します。

<?php
    echo $this->Form->input('parent_id', array('empty' => 'No Parent'));
    echo $this->Form->input('name');
?>

ユーザーが「親なし」を選択した場合、これは、parent_id = idが必要であることを意味します。ここで、idは、保存時にDBに自動的に作成される一意のIDです。

これは、「親なし」が選択されたときに$ this->request->dataに渡されるものです。

array(
    'Item' => array(
        'parent_id' => '',
        'name' => 'testname'
    )
)

beforeSaveでparent_id=idを設定しようとしましたが、idがまだ存在しないため、parent_idを割り当てるものがありません。また、最初に「親」モデルのsaveを呼び出し、コントローラーでsaveAllを呼び出してみましたが、どちらも機能しません。

コントローラ

public function add() {
    if ($this->request->is('post')) {
        $this->Item->create();

        //have tried calling parent model in self association first but 
        //if ($this->Item->ParentItem->save($this->request->data)) {
        if ($this->Item->saveAll($this->request->data)) {

            $this->Session->setFlash(__('The item has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The item could not be saved. Please, try again.'));
        }
    }

Item.php/モデルの関係

public $belongsTo = array(
  'ParentItem' => array(
  'className' => 'Item',
  'foreignKey' => 'parent_id',
  'conditions' => '',
  'fields' => '',
  'order' => ''
  )
);

public $hasMany = array(
  'ChildItem' => array(
  'className' => 'Item',
  'foreignKey' => 'parent_id',
  'dependent' => false,
  'conditions' => '',
  'fields' => '',
  'order' => '',
  ) 
);

作成/保存したばかりのIDを取得して、別のフィールド(この場合はparent_id)に保存するにはどうすればよいですか?

更新:私はこれにもう少し取り組んでおり、getInsertId()を使用して最後に挿入されたIDを取得し、それをparent_idに保存しようとしていますが、これを妨げるものがあります。モデルの検証をすべて削除して、そうでないことを確認しました。しかし、Cake(または私の関連付けの設定)には、parent_id = idを許可しないものがあります(つまり、行はそれ自体の親ですか?

これは私の追加アクションの最新のコードです...これは行をDBに保存しますが、parent_idはありません。次に、追加アクションを使用して編集を試み、parent_id = idを設定しますが、編集しても保存できません。

public function add() {
    if ($this->request->is('post')) {
        $this->Item->create();
        if ($this->Item->save($this->request->data)) {
            $last_id = $this->Item->getInsertId();
            $this->Item->saveField('parent_id', $last_id);
            $this->Session->setFlash(__('The item has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The item could not be saved. Please, try again.'));
        }
    }

$ this-> Item-> ParentItem-> save()、saveAll、'deep' => trueも呼び出してみましたが、それでもparent_id列を更新できません。行ge

前もって感謝します

4

2 に答える 2

1

関連付けのモデルでは、に設定できforegin_keyparent_id自動的に入力されます

于 2013-03-21T07:49:40.850 に答える
0

だから私が抱えていた問題...自己結合モデルでparent_id=idを設定しようとすると(基本的にidを自分の親にする)、モデルファイルのこのコードが原因です

public $actsAs = array('Tree');

ツリーの動作をもう一度読んだ後、$ this-> Model-> save(またはsaveField)がツリー構造と親IDの更新では実際にはうまく機能しないことに気付きました。代わりに行動関数を使用する必要があります私の理解を形成します。また、TreeBehaviorは、一部のparent_idがnull(少なくとも最上位のparent_ids)であることを想定しているため、これをツリーのままにしておくと、nullのparent_idを持つIDが親と見なされます。

http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html

「親フィールドはNULL値を持つことができなければなりません!最上位の要素にゼロの親値を与えるだけで機能するように見えるかもしれませんが、ツリーの並べ替え(およびその他の操作の可能性)は失敗します。」

したがって、ツリーの動作を使用するか、ツリーを使用せずに単純な親子関係を使用するかを決定する必要があります...マルチレベルツリーは必要ないので、後で行うと思います。親と1つのレベルだけです。子供。

返信ありがとうございます。

于 2013-03-22T19:40:16.970 に答える