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中 - 引擎有一个良好的开端,但缺少很多功能.
我参加派对的时间有点晚了,但最合乎逻辑的方法是将封闭的地方包裹起来吗?
Model::where('a', '=', 1)
->where(function($query) {
$query->where('b', '=', 2)
->orWhere('c', '>', 3);
})
->get();
Run Code Online (Sandbox Code Playgroud)
你测试过whereRaw()吗?
所以你的函数应该是这样的:
function scopeIsFeaturedOrIsBlogPost($query) {
return $query->whereRaw('( isFeatured = "true" OR type = "blogPost" )');
}
Run Code Online (Sandbox Code Playgroud)
附:这是未经测试的
| 归档时间: |
|
| 查看次数: |
8072 次 |
| 最近记录: |