【问题标题】:Laravel - Cron Jobs Duplicate error in LaravelLaravel - Laravel 中的 Cron 作业重复错误
【发布时间】:2019-11-04 01:30:47
【问题描述】:

我在 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 是唯一键。所以我想要它,如果它存在,操作应该忽略并移动到下一个。

【问题讨论】:

    标签: laravel


    【解决方案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'],
                ]); 
            }
       } 
    

    谢谢。

    【讨论】:

      【解决方案2】:

      你可以使用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 = [])
      

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 2013-10-09
        • 2013-01-09
        • 2013-12-08
        • 2018-10-24
        • 2016-01-09
        • 2016-12-06
        • 1970-01-01
        相关资源
        最近更新 更多