我在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是唯一键。因此,我希望该操作(如果存在)应该忽略并移至下一个操作。
答案 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'],
]
);
}
public function firstOrCreate(array $attributes, array $values = [])