Orm Phalcon:在一个事务中保存对新记录的引用

Orm Phalcon:在一个事务中保存对新记录的引用,orm,save,phalcon,phalcon-orm,Orm,Save,Phalcon,Phalcon Orm,我试图在“隐式事务”下的单个事务中保存对新对象的引用: 我正在创建同一类的两个新对象,一个引用另一个。从文档中可以看出,在保存TreeNodeB时,应在TreeNodeA上执行保存,ID将传递到TreeNodeB->parent\u tree\u node\u ID 这似乎不起作用,当我在save函数中遇到错误时,它仍作为对象传递: Object of class TreeNodes could not be converted to string 我曾尝试在模型中编写一个saveTreePa

我试图在“隐式事务”下的单个事务中保存对新对象的引用:

我正在创建同一类的两个新对象,一个引用另一个。从文档中可以看出,在保存TreeNodeB时,应在TreeNodeA上执行保存,ID将传递到
TreeNodeB->parent\u tree\u node\u ID

这似乎不起作用,当我在save函数中遇到错误时,它仍作为对象传递:

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识别父节点

    $this->belongsTo(
        'tree_parent_node_id',
        'TreeNodes',
        'node_id',
        array(
            'alias' => 'parentNode'
        )
    );
这使$treeNodeA能够在保存$treeNodeB时隐式保存

    $treeNodeA->parentNode = $parentNode;

不幸的是,没有保存引用$treeNodeA作为parentNode的$treeNodeB。也不会返回错误消息,只返回“true”。

在您链接的文档示例中,他们将
$robotPart
对象分配给
$robot->robotPart
robotPart
指的是链接的robotPart对象,而不是您试图分配对象的ID

您应该在此处使用
parentNode
,因为这是您通过
hasOne
为您的关系指定的名称

我自己还没有测试过,但是通过遵循文档的逻辑,这应该会将您推向正确的方向


改变你的关系模型,这样你就有了关系的两面

// 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'])
);

在链接的文档示例中,它们将
$robotPart
对象指定给
$robot->robotPart
robotPart
指的是链接的robotPart对象,而不是您试图分配对象的ID

您应该在此处使用
parentNode
,因为这是您通过
hasOne
为您的关系指定的名称

我自己还没有测试过,但是通过遵循文档的逻辑,这应该会将您推向正确的方向


改变你的关系模型,这样你就有了关系的两面

// 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'])
);

提摩太又来营救了!我已经试过了。我现在设法从中得到了错误:
protected$\u message=>string(31)“需要树\父\节点\ id”
。很遗憾,他们没有展示他们为Robot和RobotPartI创建的模型和别名。我看到你没有特别告诉Phalcon你与
parentNode
的关系是通过“外键”连接的,尝试在与
'alias'=>'parentNode'
相同的数组中添加
'foreignKey'=>true
,更新问题并尝试使用外键标志。它确实改变了行为,现在在尝试保存$TestNode时,引用的表上不存在字段“tree\u parent\u node\u id”的消息
值。现在您将
belongsTo
hasOne
混淆了。我现在正在玩这些。您在那里给我的配置总是给我错误“节点\u id和树\u父节点\u id之间的FK约束错误”。我在玩弄它,看看我能不能找到正确的设置,然后再去救援!我已经试过了。我现在设法从中得到了错误:
protected$\u message=>string(31)“需要树\父\节点\ id”
。很遗憾,他们没有展示他们为Robot和RobotPartI创建的模型和别名。我看到你没有特别告诉Phalcon你与
parentNode
的关系是通过“外键”连接的,尝试在与
'alias'=>'parentNode'
相同的数组中添加
'foreignKey'=>true
,更新问题并尝试使用外键标志。它确实改变了行为,现在在尝试保存$TestNode时,引用的表上不存在字段“tree\u parent\u node\u id”的消息
值。现在您将
belongsTo
hasOne
混淆了。我现在正在玩这些。您在那里给我的配置总是给我错误“节点\u id和树\u父节点\u id之间的FK约束错误”。我在玩它,看看我是否能得到正确的设置我更新了我的答案!在您的
目录中,您将
字段
切换为
引用字段
tree\u parent\u node\u id
node\u id
),我更新了我的答案!在
目录中,您将
字段
引用字段
树\u父节点\u id
节点\u id