是否使用insertUsing with ignore选项?

问题描述

在Laravel中,DB门面中存在两种有用的方法

  • 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