我正在使用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;更新工作非常顺利。