2014-07-25 44 views
0

是否有條件地鏈接PHP/Laravel中的方法或通過函數傳遞方法鏈是可能的?通過函數鏈接查詢的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()調用,當然包括不想要的結果,而不管其他鏈式方法如何。這需要嵌套先進的方法as described in Laravel docs

+0

應該可以只返回$ query;只是在Object上進行操作,在上面的例子中,返回可能工作的where()方法的結果,因爲它應該是$ this,但無論如何,您都可以在所有您想要的位置傳遞$ query對象,這就是查詢生成器的一個點。你也應該能夠克隆它並在分離的副本上進行更改,因此對於總共具有相同邏輯的情況,您將在哪裏更改選擇以進行計數並移除限制等等。 – ArtisticPhoenix

+0

@ArtisiticPhoenix - '$ query'是一個通過引用傳遞的對象,因此甚至不需要從該函數返回。上面的代碼應該可以工作。而整個'$ query = $ query'也是多餘的。 –

+0

我想我已經明白了。這不是方法鏈接或傳遞$查詢對象的問題。我認爲問題是方法的順序。我在基本查詢中有一個'()()'調用,這似乎阻止了以後'where()'方法的生效。這聽起來是對的嗎? – glasstree

回答

1

你有什麼應該工作,但可以將其簡化:

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

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

queryMethod($query); 

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

$items = $query->get(); 

由於PHP對象是通過引用傳遞,你將永遠被處理相同的實例。