2015-11-20 98 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