从json导入数据时避免重复

时间:2015-04-12 14:05:25

标签: php symfony doctrine

我每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);
}

0 个答案:

没有答案