как запустить mysql запрос в Laravel - PullRequest
1 голос
/ 07 марта 2020

Я хочу преобразовать свой MySql запрос в Запрос в Laravel, но я действительно не знаю, как это сделать. Я не знаю, как переименовать во FROM, как в SQL

Мой запрос следующий:

SELECT f2.* FROM formation f2 WHERE f2.theme_id IN 
(SELECT f.theme_id FROM user_formation uf JOIN formation f ON uf.formation_id = f.id WHERE uf.user_id = 2) 
AND f2.id NOT IN 
(SELECT formation_id FROM user_formation WHERE user_id = 2);

Я пробовал что-то подобное, но ...

$q = Formation::query()
                ->from('formation AS f2')
                ->whereIn('f2.theme_id', function($r)
                {
                    $r->select('f.theme_id')->from('user_formation AS uf')
                    ->join('formation', function($join)
                    {
                        $join->on('uf.formation_id', '=', 'f.id')
                        ->where ('uf.user_id', '=', $id)
                    });
                });

            ->whereNotIn('f2.id', function($s){
                $s->select('formation.id')
                ->from('user_formation')
                ->where('user_id', '=', $id)
            })->get();

спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Если вы хотите выполнить этот необработанный запрос, вы можете выполнить:

$res = DB::select('
  SELECT f2.* 
  FROM formation f2 
  WHERE f2.theme_id IN 
    (SELECT f.theme_id FROM user_formation uf JOIN formation f ON uf.formation_id = f.id WHERE uf.user_id = 2) 
    AND f2.id NOT IN 
    (SELECT formation_id FROM user_formation WHERE user_id = 2)');

Или вы можете переписать этот запрос в laravel построителе запросов Eloquent ORM:

Formations::query()
  ->whereIn('formations.theme_id', function($q){
      $user_formations_table = (new UserFormation)->getTable();
      $formation_table = (new Formation)->getTable();
      $q->select('paper_type_id')
        ->from($user_formations_table)
        ->join($formation_table, "$user_formations_table.formation_id", '=', "$formation_table.id")
        ->where("$user_formations_table.user_id", 2);
  })->whereNotIn('formations.id', function($q){
      $user_formations_table = (new UserFormation)->getTable();
      $q->select('formation_id')
        ->where("$user_formations_table.user_id", 2);
  })
  ->get();

Обратите внимание, что я использовал модели Formations, UserFormation, Formation Поскольку вы использовали 3 разные таблицы, вы должны добавить эти модели и указать таблицы для запуска запроса ORM

Я советую запустить первый запрос RAW, если больше нет необходимости запускать его с Eloquent

Надеюсь, это поможет вам

0 голосов
/ 07 марта 2020

Прежде всего, вам нужно исправить отступы кода, чтобы не запутаться. Во-вторых, вы поставили точку с запятой в неправильных местах. В-третьих, вам нужно передать $id внутрь функции из-за переменной scope.

$q = Formation::query()
    ->whereIn('f2.theme_id', function($r) use ($id) {
        $r->select('f.theme_id')->from('user_formation AS uf')
            ->join('formation', function($join) use ($id) {
                $join->on('uf.formation_id', '=', 'f.id')
                ->where('uf.user_id', '=', $id);
            }
        );
    })
    ->whereNotIn('f2.id', function($s) use ($id) {
        $s->select('formation.id')
        ->from('user_formation')
        ->where('user_id', '=', $id);
    })->get();

Примечание: если вы используете VSCode, я предлагаю использовать PHP Intelephense, так как это поможет с автозаполнением, синтаксисом чек, эт c.

...