symfony2 doctrine多次更新/事务

时间:2014-10-13 20:10:54

标签: sql symfony doctrine-orm transactions

我正在使用doctrine处理Symfony2项目,并且在SQL更新方面遇到了一些问题。我有一个数据库表,其中所有条目都有一个位置属性,因为订单很重要并且可以由客户更改。最后,我决定将位置保存为简单的整数值,没有任何实现的逻辑,并更新任何受影响的行。

所以,我写了这个函数

public function swapCookingStepAction($recipeId, $posBefore, $posAfter) {
    $em = $this->getDoctrine()->getManager();
    $swappedEntry = $em->getRepository('BarraFrontBundle:CookingStep')->findOneBy(array('recipe'=>$recipeId, 'position'=>$posBefore));
    $swappedEntry->setPosition($posAfter);

    if ($posBefore < $posAfter)
        $steps = $em->getRepository('BarraFrontBundle:CookingStep')->decreaseBetweenPos($recipeId, $posBefore+1, $posAfter);
    else
        $steps = $em->getRepository('BarraFrontBundle:CookingStep')->increaseBetweenPos($recipeId, $posAfter, $posBefore-1);

    $em->flush();
    return new Response("ok?");
}   

和这个带有教义的存储库

class CookingStepRepository extends EntityRepository {
public function increaseBetweenPos($recipeId, $posBefore, $posAfter)
{
    $query = $this->createQueryBuilder('c')
        ->update()
        ->set('c.position', 'c.position +1')
        ->where('c.recipe = :recipeId')
        ->andWhere('c.position BETWEEN :posBefore AND :posAfter')
        ->setParameter('posBefore', $posBefore)
        ->setParameter('posAfter', $posAfter)
        ->setParameter('recipeId', $recipeId)
        ->getQuery();

    return $query->getResult();
}

public function decreaseBetweenPos($recipeId, $posBefore, $posAfter)
{
    $query = $this->createQueryBuilder('c')
        ->update()
        ->set('c.position', 'c.position -1')
        ->where('c.recipe = :recipeId')
        ->andWhere('c.position BETWEEN :posBefore AND :posAfter')
        ->setParameter('posBefore', $posBefore)
        ->setParameter('posAfter', $posAfter)
        ->setParameter('recipeId', $recipeId)
        ->getQuery();

    return $query->getResult();
}}    

查询是按照希望构建的,但不幸的是我得到了这个主键错误

An exception occurred while executing 'UPDATE CookingStep SET position = position - 1 WHERE recipe = ? AND (position BETWEEN ? AND ?)' with params ["6", 2, "2"]:

Integrity constraint violation: 1062 Duplicate entry '1-6' for key 'PRIMARY'    

对于params(6,1,2)。我尝试使用交易,但这并没有改变任何事情。

你能帮助我吗,伙计们?

更新 刚刚在存储库函数中添加了第4个参数,可以删除第2个函数。 如果我更改测试的主键,代码&amp;更新工作非常顺利。

0 个答案:

没有答案