如何在Laravel中运行mysql查询
我想把我的MySql查询转换成Laravel中的查询,但我真的不知道怎么做。我不知道如何从SQL中重命名 我的问题如下:如何在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
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,所以结果适用于每个用户。我实际上使用的是升华文本,很抱歉代码缩进,我通常对它更认真。我的错。