我使用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');
}
}
答案 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场音乐会同一位艺术家。