问题描述
-
insertOrIgnore()
-允许在插入重复项时忽略操作 -
insertUsing()
-允许基于来自其他表的数据插入数据
我需要结合这两种方法,即根据现有数据插入数据并忽略重复项。您知道在Laravel 5.7或更高版本中有什么方法吗?
解决方法
没有一种简单的方法可以做到这一点。但这可以通过立面DB
来实现。
假设我们有2个模型:
class Car extends Model
{
protected $table = "cars";
protected $fillable = [
"name","production_year",];
}
class Antique extends Model
{
protected $table = "antiques";
protected $fillable = [
"name","category",];
}
假设我们的任务是查找所有1990年以前制造的汽车,并在此基础上创建“汽车”类别的古董,而忽略 antiques 表中已经存在的所有汽车。
这是解决方案。
$selectQuery = Car::where('production_year','<',1990)->select([
'name','production_year',DB::raw('"car" as category'),]);
$antiquesTable = (new Antique())->getTable();
$insertQuery = "INSERT IGNORE INTO $antiquesTable (
`name`,`production_year`,`category`
) "
. $selectQuery->toSql();
DB::insert($insertQuery,$selectQuery->getBindings());
它将生成以下SQL查询
INSERT IGNORE INTO antiques (`name`,`category`)
SELECT `name`,"car" AS category FROM cars WHERE `production_year` < 1990