我正在尝试在Laravel 4中创建一个更高级的查询,该查询由AND和OR where子句组成,格式如下:
(('a','=','1') OR ('b','=','s') OR ('c','=','3')) AND (('d','=','1') OR ('e','=','s') OR ('f','=','3'))
问题在于我根据用户通过某些表单应用的一些过滤器动态生成这些查询。这意味着查询可以采用以下格式:
a AND b
以及此格式:
(a OR b OR c) AND (d OR e OR f)
以及这一个:
(a OR b) AND c AND (d OR e) AND f
我将where子句生成为字符串,但我无法将此变量添加到方法调用中。
示例:
$whereclause = where(function($query){$query->where('colorgrade','like','41-2');})->where(function($query){$query->where('datetime','>','2014-11-05');})
$result = $gin->bales()->$whereclause->take(1000)->get();
我得到的错误如下:
未定义的属性:Illuminate \ Database \ Eloquent \ Relations \ HasMany :: $ where(function($ query){$ query-> where(' colorgrade',' like' ' 41-2');}) - 化合物其中(函数($查询){$查询 - 化合物其中('日期时间''>&# 39;,' 2014年11月5日');})
如何将生成的where子句(字符串变量)传递给上面的链接函数?
答案 0 :(得分:1)
要动态创建查询,请使用Eloquent Query Scopes。 这为您提供了一种基于表单选项构建不同查询的方法。
答案 1 :(得分:0)
你可能会这样做,但是我有预感这不适用于变量中的闭包和链式方法。见http://php.net/manual/en/functions.variable-functions.php
$result = $gin->bales()->$whereclause()->take(1000)->get();
另外,您可以拆分查询,这样就不会在一行内完成。
// Get the initial Query Builder instance
$query = $gin->bales();
$query->where(function($query) {
$query->where('colorgrade', 'like', '41-2');
});
if ($something === 'something') {
$query->where('something', $something);
} else {
$query->where('something', 'something_else');
}
// Finally get our results
$results = $query->take(1000)->get();