如何在Laravel中运行mysql查询

如何在Laravel中运行mysql查询,mysql,laravel,laravel-query-builder,Mysql,Laravel,Laravel Query Builder,我想把我的MySql查询转换成Laravel中的查询,但我真的不知道怎么做。我不知道如何从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 for

我想把我的MySql查询转换成Laravel中的查询,但我真的不知道怎么做。我不知道如何从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();

谢谢你的帮助。

如果要运行此原始查询,可以运行:

$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 query builder 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();
请注意,我使用了模型
Formation
UserFormation
Formation
,因为您使用了3个不同的表,所以应该添加此模型并指定表来运行ORM查询

我建议运行第一个原始查询,如果没有其他需要以雄辩的方式运行它的话


希望这对您有所帮助

首先,您需要修复代码缩进,以免混淆自己。第二,你把分号放错地方了。第三,由于变量的作用域,您需要在函数内部传递
$id

$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,因为它将有助于自动完成、语法检查等。

您可以在“原始”或“查询生成器”中运行它。你想要这两个中的哪一个?我更喜欢查询生成器,因为我现在从未使用过raw,也不知道它是如何工作的。嗯,raw我的意思是,就像使用
mysqli\u query
或类似的东西一样。从你给出的代码来看,这是错误的吗?还是什么?有什么问题吗?我的$q实际上在}上出现了语法错误,但我不知道原因在哪里,一切都在我的脑海中,我不知道我是否可以用Laravely“->从('formation AS f2')”,你不需要
,你不需要别名谢谢你的帮助,原始查询运行良好,我不知道我们可以在Laravel中设置SQL查询,太好了。我想了解一些有说服力的东西,其中的过程包括这一行
$user\u formations\u table=(newuserformation)->getTable()从模型中为您提供表名。如果指定了
public$table='tablename'
返回
tablename
,如果未指定,则返回模型名的plurar形式好的,因此如果要使用格式f2和格式f,这是使用具有不同名称的表的一种好方法?不,可以获取一次表名,然后根据需要对其进行标记。你也可以硬编码表名,但这是一个不好的做法做sookay谢谢,我没有理解的雄辩版本非常好,但这是非常有帮助的!谢谢,我知道$id,我只是用一个例子来展示,实际上我有一个$id,它接受认证用户的id,所以结果适用于每个用户。我实际上使用的是升华文本,很抱歉代码缩进,我通常对它更认真。我的错。