我试图在“隐式交易”下的单个交易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'。
答案 0 :(得分:0)
在您关联的文档示例中,他们将$robotPart
对象分配给$robot->robotPart
。 robotPart
引用链接的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'])
);