【发布时间】:2014-07-25 01:57:29
【问题描述】:
是否可以在 PHP/Laravel 中条件链接方法,或者通过函数传递方法链?
我想在 Laravel 的查询构建器中控制一个查询,方法是先设置一个基本查询,然后将它传递给一个函数以将其他方法链接到该查询。举个简单的例子:
$query = Model::whereFoo('bar');
if ($needFoo) {
$query = $query->has('foo');
}
$query = queryMethod($query);
function queryMethod($query) {
return $query->where('something', '<', 10);
}
$items = $query->get();
这似乎忽略了$query = Model::whereFoo('bar'); 和$items = $query->get(); 之间的所有内容——两者之间的$query 似乎没有任何区别。
是否有可能/可取的实现这一目标?
编辑:我接受了下面的答案,因为它回答了我提出的问题。我的问题实际上是无关的。如果它对任何人有帮助:我在基本查询中有一个流氓orWhere() 调用,它当然包括不需要的结果,而不管其他链接方法如何。这需要嵌套在高级 where 方法 as described in Laravel docs 中。
【问题讨论】:
-
应该可以只返回 $query;只需对对象进行操作,在上面的示例中,您返回的 where() 方法的结果可能会起作用,因为它应该是 $this,但无论如何您都可以将 $query 对象传递给您想要的所有对象,这有点像查询生成器的点。您还应该能够克隆它并在单独的副本上进行更改,因此对于具有相同 where 逻辑的总计,您可以更改选择以进行计数并删除限制等...
-
@ArtisiticPhoenix -
$query是一个通过引用传递的对象,因此甚至不需要从该函数返回。上面的代码应该可以工作。而整个$query = $query也是多余的。 -
我想我明白了。这不是方法链接或传递 $query 对象的问题。我认为问题在于方法的顺序。我在基本查询中有一个
with()调用,这似乎阻止了后来的where()方法生效。听起来对吗? -
@Joseph Silber,很好,我应该看到我用 Doctrine 的查询构建器做同样的事情......哈哈
-
@glasstree - 不。
with不应干扰where子句。
标签: php laravel laravel-4 method-chaining