Laravel Scope Query抛出Grammar.php异常

时间:2015-11-20 02:12:31

标签: php laravel laravel-5.1 query-builder

我在模型中设置了以下范围:

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?

2 个答案:

答案 0 :(得分:0)

您有两个名为“forwarder”的别名 - 其中一个用户加入和forwarder.name。

在某个逻辑循环中,当您声明“forwarder.name AS forwarder”时,您试图使用为其表提供的相同别名来别名别名表的属性。

它可能不是导致您的错误的原因,但这在语法上令人困惑,尽管技术上有效。这是我的猜测,但我还没有验证过。

波格丹的评论是正确的。需要更多信息。发生错误的文件和行号以及可能的完整堆栈跟踪可能会有所帮助。

答案 1 :(得分:0)

事实上,波格丹的回应是正确的。问题不是来自我的范围查询的实现,而是与我的路由设置方式有关。我设置了以下资源路径:

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

这阻止我的收件箱路线可用:

Route::get('messages/inbox', 'MessagesController@inbox');

这里的解决方案是将资源路线分解为单独的get / post路线。

Route::get('messages/index', 'MessagesController@index');
Route::post('messages/store', 'MessagesController@store');
Route::get('messages/show', 'MessagesController@show');
Route::get('messages/destroy', 'MessagesController@destroy');

我不确定是否可以将自定义控制器方法定义为资源可访问,但我无法在Laravel文档中找到任何内容。所以,这个解决方案有效,但我肯定会接受另一个答案,为此提供更合适的解决方案。

无论如何,感谢您的见解,S / O!