如何在Laravel 5.6中编写此UPDATE SQL语句?

时间:2018-06-05 08:55:16

标签: sql laravel eloquent

所以这个查询,经过用户| sticky bit |的一些帮助后工作得非常好,但现在我无法解决如何将其翻译成Laravel Eloquent结构的问题。

    UPDATE knowns
        SET engagementtitle = (SELECT instructions.engagementtitle
                                 FROM instructions
                                 WHERE instructions.reference = knowns.reference)
        WHERE EXISTS (SELECT *
                        FROM instructions 
                        WHERE instructions.reference = knowns.reference);

我挣扎的部分是Eloquent陈述汇编的非明显顺序。

我尝试过使内部部件工作的方法,然后尝试将它们进一步包裹起来。因此可以通过以下方式创建WHERE EXISTS子句:

DB::table('knowns')
    ->whereExists(function ($query) {
           $query->select(DB::raw('1'))
                 ->from('instructions')
                  ->whereRaw('instructions.reference = knowns.reference');
        })
        ->get();

哪个产生

select * from "knowns" 
where exists (select 1 from "instructions" where instructions.reference = knowns.reference)"

但是我没有进一步包装那部分。首先,我无法在文档中找到关键字" SET"的等价物。

这是我完全尝试生成上面的SQL语句。

DB::table('knowns')
->update(['instructions.reference' => 'knowns.reference'])
->select('instructions.engagementtitle')
->from('instructions')
->where('instructions.reference=knowns.reference')
->whereExists(function ($query) {
         $query->select(DB::raw('1'))
               ->from('instructions')
               ->whereRaw('instructions.reference = knowns.reference');
        })
->get();

(为狗的早餐道歉 - 它甚至看起来坏)

修改 或者我可以使用像这样的PDO方法......

$PDO=DB::connection()->getPdo();
$stmt=$PDO->prepare("
               ...SQL STATEMENT...
       ");
$stmt->execute();
$result = $stmt->fetchAll();

但是我仍然想知道是否有雄辩的方法。

1 个答案:

答案 0 :(得分:0)

你可以使用像

这样的连接重写普通的sql查询
UPDATE 
  knowns k 
  JOIN instructions i ON i.reference = k.reference
SET k.engagementtitle = i.engagementtitle 

在查询构建器中,我猜这应该可行

DB::table('knowns as k')
    ->join('instructions as i', 'i.reference', '=', 'k.reference')
    ->update(['k.engagementtitle' => DB::raw("i.engagementtitle")]);