2016-06-22 3 views
1

イム「暗黙の取引」の下で単一のトランザクションas shown here in the documentationに新しいオブジェクトへの参照を保存しようとする際に新しいレコードへの参照を保存しますもう一方を参照しています。ドキュメントから、TreeNodeBが保存され、IDがTreeNodeB->parent_tree_node_idに渡されるときに保存が実行される必要があります。Phalconは:</p> <p>私は同じクラスの2つの新しいオブジェクトを作成しています、1:1つのトランザクション

これは機能していないように見えますが、機能:

Object of class TreeNodes could not be converted to string 

私がモデルにsaveTreeParentNodeId機能を書いてみましたし、また別名を使用してそれを設定するが、動作するようには思えませんどちらもしました。

$treeNode = new TreeNodes(); 
    $treeNode->setConnectionService(Registry::setConnection(MyModel::MAIN_DB)); 
    $parentNode = $treeNode->findFirst(); 

    $treeNodeA = new TreeNodes(); 
    $treeNodeA->tree_id = $parentNode->tree_id; 
    $treeNodeA->tree_parent_node_id = $parentNode; 
    $treeNodeA->tree_level_id = 2; 
    $treeNodeA->node_desc = "Test Node A"; 

    $treeNodeB = new TreeNodes(); 
    $treeNodeB->tree_id = $parentNode->tree_id; 
    $treeNodeB->tree_parent_node_id = $treeNodeA; 
    $treeNodeB->tree_level_id = 3; 
    $treeNodeB->tree_desc = "Test Node B"; 
    $treeNodeB->save(); 

モデル:

class TreeNodes extends MyModel 
{ 
    public $node_id; 
    public $tree_id; 
    public $tree_parent_node_id; 
    public $tree_level_id; 
    public $node_desc; 

    public function getSource() 
    { 
     return "TreeNodes"; 
    } 

    public function setTreeParentNodeId(TreeNodes $parentNode){ 
     $this->tree_parent_node_id = $parentNode->node_id; 
    } 

    public function initialize() 
    { 
     parent::initialize(); 

     $this->belongsTo(
      'tree_id', 
      'Organisations', 
      'TreeID', 
      array(
       'alias' => 'organisation', 
       'reusable' => true 
      ) 
     ); 

     $this->hasOne(
      'tree_id', 
      'TreeType', 
      'tree_id', 
      array(
       'alias' => 'type', 
       'reusable' => true 
      ) 
     ); 

     $this->hasOne(
      'tree_parent_node_id', 
      'TreeNodes', 
      'node_id', 
      array(
       'alias' => 'parentNode' 
      ) 
     ); 
    } 
} 

更新

belongsToのを使用するようにモデルを更新することにより、PhalconはのparentNodeを認識しています。

$this->belongsTo(
     'tree_parent_node_id', 
     'TreeNodes', 
     'node_id', 
     array(
      'alias' => 'parentNode' 
     ) 
    ); 

これにより、$ treeNodeBが保存されるときに$ treeNodeAが暗黙的に保存されるようになります。

$treeNodeA->parentNode = $parentNode; 

残念ながら、parentNodeとして$ treeNodeAを参照する$ treeNodeBは保存されません。どちらのエラーメッセージも返されず、単に 'true'になります。

+0

の両側を持っているので!あなたの 'belongsTo'では'参照されたフィールド '(' tree_parent_node_id'と 'node_id')であなたの' field'を切り替えました – Timothy

答えて

0

リンクしたドキュメントの例では、$robotPartオブジェクトを$robot->robotPartに割り当てます。 robotPartは、これはあなたがhasOneを経由してあなたの関係に付けた名前であるため、あなたがここにparentNodeを使用する必要があります

$treeNodeB = new TreeNodes(); 
$treeNodeB->tree_id = $parentNode->tree_id; 
// $treeNodeB->tree_parent_node_id = $treeNodeA; 
$treeNodeB->parentNode = $treeNodeA; 
$treeNodeB->save(); 

(あなたがオブジェクトを割り当てるしようとしているに)リンクされRobotPartオブジェクトにしていないIDを指します。

私はこれを自分でテストしていませんが、ドキュメントのロジックに従うことで、正しい方向に進むはずです。


アルターあなたのモデルの関係私は私の答えを更新された関係

// let Phalcon know that "tree_parent_node_id" is a reference to "node_id" 
$this->hasOne(
    'tree_parent_node_id', // your column 
    'TreeNodes', // referenced table 
    'node_id', // referenced table column 
    array(
     'alias'  => 'parentNode', 
     'foreignKey' => true 
    ) 
); 

// let Phalcon know that "node_id" is being referenced as a FK in "TreeNodes" 
$this->belongsTo(
    'node_id', // PK 
    'TreeNodes', // referenced table 
    'tree_parent_node_id', // referenced table column 
    array('foreignKey' => ['message' => 'FK constraint error between node_id and tree_parent_node_id']) 
); 
+0

ティモシーが再び救助に!私はこれをすでに試してみました。 Iveはそれからエラーを取得することができました: 'protected $ _message => string(31)" tree_parent_node_idは必須です。そのモデルと別名をRobotとRobotPartのために作成したモデルとエイリアスを表示していないことは残念です – JackalopeZero

+0

Phalconに 'parentNode'との関係が"外部キー "を介して接続されていると具体的には言及していないことがわかります。' foreignKey '= > 'alias' => 'parentNode''と同じ配列の中で> trueを返します – Timothy

+0

質問を更新し、外部キーフラグを使用しようとしました。$ testNodeAを保存しようとすると、動作が変更され、 'フィールドの値 'tree_parent_node_idが存在しません。 – JackalopeZero

関連する問題