学说:使用集合进行更新

时间:2014-08-27 09:54:38

标签: php mysql doctrine doctrine-1.2

问题/如何

  1. 将angularJS传递给包含多个连接的查询的数组结果。
  2. 使用angularJS进行排序,使用ui-sortable在排序时重新排序数据集。
  3. 将数据传回PHP并使用synchronizeWithArray保存(创建集合)。
  4. Doctrine不喜欢以与输出不同的顺序接收集合的数据。
  5. **如果我改变的只是值 - 没有重新排序元素就可以保存而没有任何问题。
  6. 更新: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'
            )
        )
    )
    

1 个答案:

答案 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;
}