2013-01-17 44 views
0

以下是我遇到的问题。Symfony2在flush之前/之前将其他行设置为0

我有一个表,其中包含一个名为shown_on_homepage的列,只有一行应该设置为1,其余应该都设置为0.我试图添加一个新行到数据库,这应该被设置为1,设定以前有一个1比0

在MySQL我知道这可以通过发出插入前的更新来实现:

UPDATE table_name SET shown_on_homepage = 0 

这里是我的实体:

class FeaturedPerson { 

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/  
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="content", type="string", length=2500, nullable=false) 
*/ 
private $content; 

/** 
* @var \DateTime 
* 
* @ORM\Column(name="date_updated", type="datetime") 
*/ 
private $dateUpdated; 


/** 
* @var bool 
* 
* @ORM\Column(name="shown_on_homepage", type="boolean", nullable=false) 
*/ 
private $isShownOnHomepage; 

//... 

public function getIsShownOnHomepage() { 
    return $this->isShownOnHomepage; 
} 

public function setIsShownOnHomepage($isShownOnHomepage) { 
    $this->isShownOnHomepage = $isShownOnHomepage; 
    return $this; 
} 

} 

而对于我已经控制器:

$featured = new FeaturedPerson(); 
$featured->setContent('Test content.'); 
$featured->setDateUpdated('01/02/2013.'); 
$featured->setIsShownOnHomepage(TRUE); 

$em = $this->getDoctrine()->getManager(); 
$em->persist($featured); 
$em->flush(); 

它确实增加了新行,但有一个shown_on_homepage设置为1,一个仍然有它。我已经研究过,但是我找不到实现这个目标的方法,我希望你能帮助我。

回答

1

你可以在你的控制器现有的代码之前执行的查询:

$queryBuilder = $this->getDoctrine()->getRepository('YourBundleName:FeaturedPerson')->createQueryBuilder('qb'); 
$result = $queryBuilder->update('YourBundleName:FeaturedPerson', 'd') 
      ->set('d.isShownOnHomepage', $queryBuilder->expr()->literal(0)) 
      ->where('d.isShownOnHomepage = :shown') 
      ->setParameter('shown', 1) 
      ->getQuery() 
      ->execute(); 

改变“YourBundleName”你包名称。

+0

太棒了,它像一个魅力工作!谢谢FWmr。 –