【问题标题】:Laravel method chaining a query through a functionLaravel 方法通过函数链接查询
【发布时间】: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-&gt;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


【解决方案1】:

你所拥有的应该可以工作,但你可以简化它:

$query = Model::whereFoo('bar');

if ($needFoo) $query->has('foo');

queryMethod($query);

function queryMethod($query) {
    $query->where('something', '<', 10);
}

$items = $query->get();

由于 PHP 中的对象是通过引用传递的,因此您将始终处理同一个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2015-11-07
    • 2015-10-06
    • 2015-10-12
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多