Как мне написать этот оператор SQL UPDATE в Laravel 5.6? - PullRequest
0 голосов
/ 05 июня 2018

Итак, этот запрос после некоторой помощи от пользователя | 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();

Но я все равно хотел бы знать, есть ли подход Eloquent.

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете переписать свой простой 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")]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...