使用laravel查询构建器嵌套选择

时间:2017-12-11 17:08:22

标签: php mysql laravel

我试图找到将此原始SQL转换为laravel查询构建器的方法:

SELECT value1,value2 
FROM foo
WHERE id NOT IN(
   SELECT id 
   FROM foo 
   HERE foo.key = 'client_location_id');

我已经查看了laravel docks,但是没有任何明确的方法可以将nexted选项转换为他们的查询构建器版本。

2 个答案:

答案 0 :(得分:1)

您可以使用whereDoesntHave功能:

$c = Foo::whereDoesntHave('fooRelation', function ($query) use ($clientLocationId) {
    $query->where('key', clientLocationId);
})->get();

如果您在Foo模型中设置关系,这将起作用,例如:

public function fooRelation() 
{
    return $this->hasMany(Foo::class);
}

答案 1 :(得分:0)

Laravel的whereNotIn运算符也接受嵌套查询的函数:

$result = DB::table("foo")
          ->whereNotIn(function ($query) {
                $query->from("foo as f2")
                      ->where("f2.key", "client_location_id")
                      ->select("id");
          })->select("value1","value2")->get();  

这将产生以下查询(如果您执行->toSQL()而不是->get(),则可以验证您获得的查询)

select `value1`, `value2` 
from `foo` 
where `id` not in (
     select `id` from `foo` as `f2` where `f2`.`key` = ?
)

当然我可以指出这个特定的查询不需要嵌套选择,但我假设这只是一个例子。

话虽如此,如果您的项目很大,雄辩的ORM是一个更好的长期解决方案。