1

我试图在单个事务中保存对新对象的引用,如“隐式事务”下的文档中所示:

我正在创建同一类的两个新对象,然后一个引用另一个。从文档中,保存 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 识别出父节点。

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

这使得 $treeNodeA 在保存 $treeNodeB 时可以隐式保存。

    $treeNodeA->parentNode = $parentNode;

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

4

1 回答 1

0

在您链接的文档示例中,他们将$robotPart对象分配给$robot->robotPart. robotPart指链接的 RobotPart 对象,而不是 ID(您尝试将对象分配到的 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'])
);
于 2016-06-22T10:51:55.417 回答