2015-11-20 171 views
2

我有以下範圍在模型建立:Laravel範圍查詢拋出異常Grammar.php

public function scopeInbox($query, $order = 'desc'){ 
    $userId = Auth::user()->id; 

    return $query 
     ->where('current_inbox','=',$userId) 
     ->join('users', 'messages.created_by', '=', 'users.id') 
     ->join('users as forwarder', 'messages.forwarded_by', '=', 'forwarder.id') 
     ->select('messages.*', 'users.name', 'forwarder.name as forwarder') 
     ->orderBy('updated_at', $order); 
} 

而且在它下面的關聯控制器:

public function inbox() 
{ 
    $messages = Message::inbox(); 

    return response($messages->get()); 
} 

而Laravel不斷拋出以下例外:

Argument 1 passed to Illuminate\Database\Grammar::columnize() must be of the type array, string given 

任何想法,S/O?

+0

'scopeInbox'? '消息:: scopeInbox'? – aldrin27

+0

我的代碼幾乎完全按照文檔:http://laravel.com/docs/5.1/eloquent#query-scopes「範圍」不應該是必要的。 –

+2

就查詢生成器語法而言,您的代碼是正確的。你確定錯誤是從那裏來的嗎?您沒有包含引發錯誤的文件和行。 – Bogdan

回答

0

您有兩個名爲「forwarder」的別名 - 其中一個用戶連接和forwarder.name。

在某些邏輯循環中,當您聲明「forwarder.name AS forwarder」時,您試圖別名表中具有相同別名的別名表的屬性。

它可能不是什麼導致你的錯誤,但這是語法混淆,雖然技術上有效。這是我的猜測,但我沒有驗證它。

Bogdan的評論是正確的。需要更多信息。發生錯誤的文件和行號以及可能的完整堆棧跟蹤可能會有所幫助。

+0

感謝您的詳細信息Trip,但不幸的是,這不是問題。如果您想查看,我已發佈了我的調查結果。 –

0

波格丹的回答確實是正確的。這個問題不是來自我實現範圍查詢的,而是與我的路由設置方式有關。我已經建立了下面的資源路徑:

Route::resource('messages', 'MessagesController', 
    ['only' => [ 
     'index', 
     'store', 
     'show', 
     'destroy' 
     ] 
    ] 
); 

這是防止被可我的收件箱路線:

Route::get('messages/inbox', '[email protected]'); 

這裏的解決方案,是打出來的資源路由到單獨的GET/POST路線。

Route::get('messages/index', '[email protected]'); 
Route::post('messages/store', '[email protected]'); 
Route::get('messages/show', '[email protected]'); 
Route::get('messages/destroy', '[email protected]'); 

我不知道是否有一種方法來定義自定義控制器方法可訪問的資源,但是我找不到在Laravel文檔任何東西。所以,這個解決方案的工作原理,但我肯定會接受另一個答案,提供了一個更適當的解決方案。

無論如何,感謝您的洞察力,S/O!

+1

我認爲如果你沒有使用'only',這可能會奏效。如果您對解決方案不滿意,您可以定義一個正常的資源路線,然後添加您的「收件箱」路線。如果您非常關心定義/銷燬路線,您可以通過在控制器中爲其添加重定向響應來手動阻止它。 – Trip

+0

謝謝,旅途 - 我實際上發現我的問題是我在資源路線之後定義了我的路線。通過在資源路由之前放置自定義路由,我能夠保留這兩種實現。但是,如何將收件箱路由添加到資源?我認爲資源路線被限制在一個特定的集合? –

+0

這實際上只是一種額外的路線和方法,而不是一些神奇的新資源路線。你可以單獨定義它。 Route :: resource('message','MessagesController'); Route :: get('message/inbox','MessagesController @ inbox'); – Trip