我每15分钟使用symfony2命令将数据从json字符串导入mysql数据库,但我正在努力处理重复的条目。
示例json:
“a”:“Armin van Buuren”, “T”: “夏弗斯”,
要确定它是否存在,我正在使用doctrines findByName方法:
$entity = $em->getRepository('Bundle:Entity')->findByName($obj[$i]['t']);
然后进行两次检查
if(count($entity)==0) {return false;}
if(strcasecmp($entity[0]->getArtist()->getName(), $artist) != 0) {return false;}
我不知道为什么,但我得到了很多这样的条目:
id artist_id name created_at
3577 30 Satellite 2015-04-12 15:45:04
3578 129 Suburban Train 2015-04-12 15:45:04
3579 317 Traffic 2015-04-12 15:45:04
3575 1062 Holding On To Nothing 2015-04-12 15:45:03
3576 506 Rapture 2015-04-12 15:45:03
3573 129 Suburban Train 2015-04-12 15:30:04
3574 317 Traffic 2015-04-12 15:30:04
3572 30 Satellite 2015-04-12 15:30:03
3571 317 Traffic 2015-04-12 15:15:01
有些曲目正在重复,但并非全部。
我已经从doctrine检查了生成的sql,看起来很好,例如:
SELECT t0.id AS id1, t0.name AS name2, t0.image AS image3, t0.created_at AS created_at4, t0.updated_at AS updated_at5, t0.video_id AS video_id6, t0.artist_id AS artist_id7 FROM Track t0 WHERE t0.name = 'Traffic'
我该怎么做才能避免这些重复?
修改
整个功能:
private function fetchAction($url) {
$json = file_get_contents($url);
$obj = json_decode($json, true);
$count = count($obj);
for($i=0;$i < $count; $i++) {
$track = $obj[$i]['t'];
$artist = $obj[$i]['a'];
if($track==='Unknown Track') continue;
if($artist==='Unknown Artist') continue;
$em = $this->getContainer()->get('doctrine')->getManager();
$trackEntity = $em->getRepository('Bundle:Track')->findByName($track);
$artistEntity = $em->getRepository('Bundle:Artist')->findByName($artist);
/**
* check whether artist exists
*/
if(!$this->artistExists($artistEntity)) {
$this->createArtist($artist, $em);
}
/*
* check whether track already exists
*/
if(!$this->trackExists($trackEntity, $artist)) {
$this->createTrack($obj[$i], $em, $artistEntity);
}
}
}
private function trackExists($trackEntity, $artist) {
if(count($trackEntity)==0) {
return false;
}
if(strcasecmp($trackEntity[0]->getArtist()->getName(), $artist) != 0) {
return false;
}
return true;
}
private function artistExists($artistEntity) {
if(count($artistEntity)==0) return false;
return true;
}
private function createArtist($artist, $em) {
$entity = new Artist();
$entity->setName($artist);
$em->persist($entity);
$em->flush($entity);
}
private function createTrack($trackArray, $em, $artistEntity) {
$entity = new Track();
$entity->setName($trackArray['t']);
$entity->setArtist($artistEntity[0]);
$entity->setImage($this->saveImage($trackArray));
$em->persist($entity);
$em->flush($entity);
}