Luis Franco
Luis Franco

Reputation: 782

Symfony2 setting other rows to 0 after/before flush

Here's what I'm having trouble with.

I've a Table which contains a column called shown_on_homepage and only one row should be set to 1, the rest should all be set to 0. I'm trying to add a new row to the database and this one should be set to 1, setting the one that previously had a 1 to 0.

In MySQL I know this can be achieved by issuing an update before the insert:

UPDATE table_name SET shown_on_homepage = 0

Here's my Entity:

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

}

And for the Controller I've:

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

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

It does add the new row, but the one that had a shown_on_homepage set to 1 still has it. I've researched but I couldn't find a way to achieve this, I hope you can help me.

Upvotes: 0

Views: 85

Answers (1)

FWrnr
FWrnr

Reputation: 361

You could execute a query prior to your existing code in your controller:

$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();

Change 'YourBundleName' to your bundle name.

Upvotes: 1

Related Questions