Laravel-Laravel中的Cron Jobs Duplicate错误

时间:2019-06-21 08:09:53

标签: laravel

我在Laravel中编写了一个cron作业代码,如下所示,但是有时我的日志中会出现重复的错误。

  

下一个Doctrine \ DBAL \ Driver \ PDOException:SQLSTATE [23000]:违反完整性约束:1062 / home / mms / public_html / vendor / doctrine / dbal / lib / Doctrine /中的键“ smskey”的条目“ f984rfhnd”重复DBAL /驱动程序/PDOStatement.php:143   堆栈跟踪:

public function handle() {


    $array_content=[];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://api.testing.com/article/feeddsdwst7?_fmt=json&_rt=b&ctg=english%20football%20sms&_fld=tsr,pt&kwd=arsenal");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Important
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    $result = curl_exec($ch);
   // return $result;

    $array = json_decode($result, true);
    $category="arsenal";
    $title=$array['title'];
    $description=$array['description'];
    $asset_count=$array['assetCount'];
    $articles= $array['articles'];
    if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
    }
    curl_close ($ch);


   foreach( $articles as $art)
   {
        SmsFeed::create([
            'smskey'      =>  $art['id'],
            'category'     =>  $category,
             'asset_count'  =>   $asset_count,
            'title'     => $title,
            'description' =>$description,
            'published_time'    => $art['publishedTime'],
            'teaser'    => $art['teaser'],

        ]); 
   } 
}

smskey是唯一键。因此,我希望该操作(如果存在)应该忽略并移至下一个操作。

2 个答案:

答案 0 :(得分:1)

实际上,如果给定的字符串大小超过数据库中相应列的长度,则会发生Integrity constraint violation: 1062错误。

能否请您验证数据库中smskey列的大小

要在出现重复项时跳过,应该确定是否存在重复项。

foreach( $articles as $art)
   {
        $duplicate = SmsFeed::where('smskey',$art['id'])->count(); 
        if($duplicate == 0)
        {
            SmsFeed::create([
               'smskey'      =>  $art['id'],
               'category'     =>  $category,
               'asset_count'  =>   $asset_count,
               'title'     => $title,
               'description' =>$description,
               'published_time'    => $art['publishedTime'],
               'teaser'    => $art['teaser'],
            ]); 
        }
   } 

谢谢。

答案 1 :(得分:0)

您可以为此使用firstOrCreate,它将获得匹配属性的第一条记录或创建它。

foreach ($articles as $article) {
    SmsFeed::firstOrCreate(
        ['smskey' => $article['id']],
        [
            'category'       => $category,
            'asset_count'    => $asset_count,
            'title'          => $title,
            'description'    => $description,
            'published_time' => $article['publishedTime'],
            'teaser'         => $article['teaser'],
        ]
    );
}

docs

public function firstOrCreate(array $attributes, array $values = [])