更新:http://www.doctrine-project.org/jira/browse/DC-346
注意到这是一个他们从未修复的旧bug,还有什么东西可以做我想要的吗?
$model = Doctrine_Core::getTable('TableName')->findOneById(...);
$model->synchronizeWithArray(array);
$model->save();
Doctrine(1.2)/ mysql抛出完整性错误,重复主键id = 2 - 它正在尝试更改id字段。
当我使用ui-sortable重新排序元素时,它会在“Fields”中移动数组,同时还会更新“position”值。
这是示例数据:
问题是数组0和数组1交换位置 - 导致主题在尝试更改ID时导致主键错误。
array( // the root of the array is part of one table
id => 1001,
label => 'xxx',
Fields => array( // related table data
0 => array(
id => 1,
position => 0,
name => 'item1'
),
1 => array(
id => 2,
position => 1,
name => 'item2'
),
2 => array(
id => 3,
position => 2,
name => 'item3'
),
3 => array(
id => 4,
position => 3,
name => 'item4'
)
)
)
答案 0 :(得分:0)
嗯,我想我们可以查看Doctrine方面并尝试修复此错误,或者让它与Doctrine运行的方式一起工作。第二种选择可能更容易。
为什么不直接保存数据的顺序,并在将其反馈给学说之前按顺序放回?一种方法是角度。无论你在哪里得到有角度的数据数组,调用saveOrder(),然后在反馈之前,调用reOrder():
var order = {};
function saveOrder(data)
{
for(var key in data)
{
if(data.hasOwnProperty(key))
{
order[data[key].id] = key;
}
}
}
function reOrder(data)
{
var ordered = [];
for(var key in data)
{
if(data.hasOwnProperty(key))
{
ordered[order[data[key].id]] = data[key];
}
}
return ordered;
}