Phalcon:在一次交易中保存对新记录的引用

时间:2016-06-22 10:37:07

标签: orm save phalcon phalcon-orm

我试图在“隐式交易”下的单个交易as shown here in the documentation中保存对新对象的引用':

我正在创建同一个类的两个新对象,然后一个引用另一个。从文档中,保存TreeNodeB时应该在TreeNodeA上执行保存,ID将传递给TreeNodeB->parent_tree_node_id

这似乎不起作用,它仍然作为对象传递,因为我在保存函数上得到了错误:

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;

不幸的是,没有保存带有$ treeNodeA引用的$ treeNodeB作为parentNode。也没有返回任何错误消息,只是' true'。

1 个答案:

答案 0 :(得分:0)

在您关联的文档示例中,他们将$robotPart对象分配给$robot->robotPartrobotPart引用链接的RobotPart对象而不是ID(您尝试为其分配对象)

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

您应该在此使用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'])
);