链接时如何将Laravel Eloquent ORM查询范围包含在括号中?

cro*_*n85 12 laravel eloquent laravel-4

在Eloquent中,我想生成此查询:

SELECT * FROM table WHERE a=1 AND ( b=2 OR c=3 );
Run Code Online (Sandbox Code Playgroud)

但我似乎正在生成此查询:

SELECT * FROM table WHERE a=1 AND b=2 OR c=3;
Run Code Online (Sandbox Code Playgroud)

这是我的实现和代码:

$result = Model::aIsOne()->bIsTwoOrCIsThree()->get();
Run Code Online (Sandbox Code Playgroud)

Model 包含:

function scopeAIsOne($query) {
    return $query->where('a', 1);
}

function scopeBIsTwoOrCIsThree($query) {
    return $query->where('b', 2)->orWhere('c', 3);
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.我搜索过包括Advanced Wheres在内的文档无济于事.

Mar*_*dis 25

您可以通过传递回调函数来生成括号where().

Model::where('a',1)->where(function($query) {
    $query->where('b', 2)->orWhere('c',3);
})->get();
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 10

查看编辑以获得最终答案

比原始更好,使用或者使用封闭:

$model = Model::whereAIsOne()->orWhere(function($query) {
    $query->where('b', 1)->where('c', 1);
})->get();
Run Code Online (Sandbox Code Playgroud)

非常不幸的事情(以及我在这篇文章中的结果)是闭包中使用的第二个$查询是\ Illuminate\Database\Query\Builder的实例,而不是\ Illuminate\Database\Eloquent\Builder - 这意味着您不能在该闭包中使用模型范围,因为Query\Builder实例没有对模型的引用.

也就是说,我仍然认为这更像ORM并且作为开发人员很有用.

编辑

花了一段时间才弄清楚,但是如果你想要使用你的范围,这将有效:

$model = Model::whereAIsOne()->orWhere(function($query) {
    $this->newEloquentBuilder($query)->setModel($this)->whereBIsOneAndCIsOne();
})->get();
Run Code Online (Sandbox Code Playgroud)

我实际上在我的代码中创建了第四个范围,包含所有这些,所以$this可能在这个上下文中不起作用 - 但是,我发现我的模型的范围是构建一个好系统最重要的部分之一.

这绝对应该被内置到Eloquent中 - 引擎有一个良好的开端,但缺少很多功能.


S16*_*S16 6

我参加派对的时间有点晚了,但最合乎逻辑的方法是将封闭的地方包裹起来吗?

    Model::where('a', '=', 1)
            ->where(function($query) {
                    $query->where('b', '=', 2)
                    ->orWhere('c', '>', 3);
    })
    ->get();
Run Code Online (Sandbox Code Playgroud)

  • 对于那些需要将变量传递到嵌套中的人,请记住`USE` 例如:`->where(function($query) use ($options) { $query...` (2认同)

ray*_*ema 2

你测试过whereRaw()吗?

所以你的函数应该是这样的:

function scopeIsFeaturedOrIsBlogPost($query) {
    return $query->whereRaw('( isFeatured = "true" OR type = "blogPost" )');
}
Run Code Online (Sandbox Code Playgroud)

附:这是未经测试的