不将重复项插入MySQL DB - Doctrine和Symfony2

时间:2014-08-20 12:47:43

标签: php mysql symfony doctrine-orm doctrine

我使用Symfony2和Doctrine将API中的一些数据保存到MySQL数据库中。我有一个名为Gig的实体,我使用注释来设置约束。我认为相关的部分看起来像:

namespace London\HelloBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Gig
 * @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(columns={"Artist", "ConcertDate"})})
 * @ORM\Entity
 */
class Gig
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 * @ORM\Column(name="Artist", type="string", length=255, nullable=true)
 */
private $artist;

/**
 * @var string
 * @ORM\Column(name="ConcertDate", type="string", length=255)
 */
private $concertDate;

在我的控制器中,我使用Buzz https://github.com/sensiolabs/SensioBuzzBundle来浏览API并将我想要的位保存到数据库中。这一切都适用于第一次导入。

但是我将Artist和ConcertDate列的组合设置为唯一,因为我不想将API中的相同项目读入数据库两次。当我触发处理此操作的操作时,我收到错误

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Plaid-2014-08-12' for key      'UNIQ_ED7D66426F593B176DAA24E'
500 Internal Server Error - DBALException
1 linked Exception: PDOException »

我认为这是应该的,但我真正想要的是坚持新数据并跳过我已有的数据。任何人都可以帮我这个吗?

修改 根据评论请求添加将数据持久保存到db的代码。

namespace London\APIBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use London\HelloBundle\Entity\Gig;

class DefaultController extends Controller
{
  public function indexAction()
  {
    $buzz = $this->container->get('buzz');
    $response = $buzz->get('http://myapiuri');
    echo $buzz->getLastRequest(). "\n";
    $content = $response->getContent();
    $data = json_decode($content);
    $stuff=$data->resultsPage->results->event;
    for ($i=0; $i < sizeof($stuff) ; $i++) {
        $gig = new Gig();
        if(isset($stuff[$i]->performance[0])){
            $gig->setArtist($stuff[$i]->performance[0]->displayName);
        }
        $gig->setConcertDate($stuff[$i]->start->date);
        $gig->setVenueName($stuff[$i]->venue->displayName);
        $gig->setGenre($stuff[$i]->type);
        $gig->setVenueAddress('45 Queen Caroline Street, London, England W6 9QH');

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

    }
    return $this->render('LondonAPIBundle:Default:index.html.twig');
  }
}

2 个答案:

答案 0 :(得分:2)

您可以检查具有相同密钥的实体是否已存在,只有在不存在的情况下才会插入。

$exists = $em->getRepository('London\HelloBundle\Entity\Gig')->findBy(array(
    'Artist' => $gig->getArtist(), 
    'ConcertDate' => $gig->getConcertDate()
);

if(!$exists) {
    $em->persist($gig);
    $em->flush();
}

或者,您可以捕获重复的异常。

try {
    $em->persist($gig);
    $em->flush(); 
}
catch(\Doctrine\DBAL\DBALException $e) {

    //if the error is not for duplicates, throw the error
    if($e->getErrorCode() != $error_code_for_dupes) {
        throw $e;
    }

    //otherwise ignore it
}

答案 1 :(得分:-2)

删除唯一约束

uniqueConstraints={@ORM\UniqueConstraint(columns={"Artist", "ConcertDate"})}

如果可以在同一日期举办2场音乐会同一位艺术家。