如何在 Laravel 中的 SELECT 语句后插入记录时应用“ON CONFLICT”条件?

Posted

技术标签:

【中文标题】如何在 Laravel 中的 SELECT 语句后插入记录时应用“ON CONFLICT”条件?【英文标题】:How to apply 'ON CONFLICT' condition while Inserting records after SELECT statement in Laravel? 【发布时间】:2020-04-09 23:04:36 【问题描述】:

下面是需要 Laravel 查询的 SQL 查询。

    INSERT INTO 'details' (id, contact) 
    SELECT DISTINCT tmp_details.id, students.contact 
    FROM 'tmp_details'
    INNER JOIN 'students' USING(name) 
    ON CONFLICT DO NOTHING;    

我无法应用ON CONFLICT 条件。

我已将其部分转换如下。

    $strSQL =  DB::table('tmp_details')
                ->join('students', 'tmp_details.name', '=', 'students.name')
                ->select('tmp_details.id','students.contact');
               DB::table('details')->insertUsing(['id', 'contact'], $strSql);

【问题讨论】:

不确定但试试insertOrIgnore 我尝试使用 insertOrIgnore,但出现如下错误: SQLSTATE[42703]: Undefined column: 7 ERROR: column "0" of relationship "details" does not exist LINE 1: insert into "details " ("0", "1") 冲突时的值 ($1, $2)... ^ (SQL: insert into "details" ("0", "1") 冲突时的值 (id, contact) 什么都不做) 显示您的查询。 DB::table('details')->insertOrIgnore(['id', 'contact'], $strSql); //relapced only insertUsing 我无法插入记录,可能是参数必须是一个数组并且值不应该在变量中给出。 我会研究现成的解决方案:github.com/staudenmeir/laravel-upsert 【参考方案1】:

不确定,但试试这个。

$strSQL =  DB::table('tmp_details')
              ->join('students', 'tmp_details.name', '=', 'students.name')
              ->pluck('tmp_details.id','students.contact');

DB::table('details')->insertOrIgnore($strSql);

【讨论】:

【参考方案2】:

尝试使用DB::select()声明:

DB::select("
    INSERT INTO 'details' (id, contact) 
    SELECT DISTINCT tmp_details.id, students.contact 
    FROM 'tmp_details'
    INNER JOIN 'students' USING(name) 
    ON CONFLICT DO NOTHING;
");

【讨论】:

以上是关于如何在 Laravel 中的 SELECT 语句后插入记录时应用“ON CONFLICT”条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.2 中重新加载页面后保留 select2 值?

如何使用 if 语句比较 laravel 数据库中的值?

在 Laravel 中如何使用 if 语句停止计算?

c# 写网页,如何获得SQL select语句后的记录数?

SELECT 语句上的 Laravel 数学运算

在 Laravel 7.x 中从 DB::select 获取单个值