Laravel - Cron Jobs Повторяющаяся ошибка в Laravel - PullRequest
2 голосов
/ 21 июня 2019

Я пишу код задания cron в Laravel, как показано ниже, но иногда я получаю дублирующую ошибку в своем журнале.

Следующее Doctrine \ DBAL \ Driver \ PDOException: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись 'f984rfhnd' для ключа 'smskey' в / home / mms / public_html / vendor / doctrine / dbal / lib / Doctrine / 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 ]

1 голос
/ 21 июня 2019

На самом деле 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'],
            ]); 
        }
   } 

Спасибо.

0 голосов
/ 21 июня 2019

Вы можете использовать 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 1006 *

public function firstOrCreate(array $attributes, array $values = [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...