2015-11-20 3 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 «scope» не требуется. –

+2

Ваш код верен, если синтаксис Query Builder включен. Вы уверены, что ошибка исходит оттуда? Вы не указали файл и строку, где была вызвана ошибка. – Bogdan

ответ

0

У вас есть два псевдонима, называемых «форвардер» - один из пользователей присоединяется и имя forwarder.name.

В каком-то логическом цикле вы пытаетесь создать псевдоним атрибута таблицы с псевдонимом с тем же псевдонимом, который указан в его таблице, когда вы указываете «forwarder.name AS forwarder».

Возможно, это не то, что вызывает вашу ошибку, но это грамматически запутанное, хотя и технически обоснованное. Это было бы моим догадком, но я не проверил его.

Комментарий Богдана является правильным. Требуется дополнительная информация. Номер файла и строки, где произошла ошибка, и, возможно, полная трассировка стека.

+0

Спасибо за подробную информацию. Поездка, но это не проблема, к сожалению. Я опубликовал свои результаты, если вы хотите увидеть. –

0

Ответ Богдана был, действительно, правильным. Проблема не заключалась в моей реализации запроса области, но вместо этого была связана с тем, как были настроены мои маршруты. Я создал следующий маршрут ресурса:

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

мешающей мой почтовый ящик маршрут от того, доступно:

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

Решения здесь, должны был вспыхнуть ресурсные маршруты в отдельные прибудут/почтовые маршруты ,

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

Я думаю, что это сработало бы, если бы вы не использовали «только». Если вы не удовлетворены своим решением, вы можете просто определить маршрут нормального ресурса, а затем добавить свой маршрут «Входящие». Если вас сильно беспокоит определенный маршрут/уничтожение, вы можете вручную заблокировать его, добавив для него ответ перенаправления в своем контроллере. – Trip

+0

Спасибо, Trip - я действительно обнаружил, что моя проблема в том, что я определял свои маршруты после маршрута ресурса. Поместив пользовательские маршруты до маршрута ресурса, я смог сохранить обе реализации. Как я могу добавить маршрут входящих сообщений к ресурсу? Я думал, что маршруты ресурсов были ограничены определенным набором? –

+0

Это действительно просто дополнительный маршрут и способ, а не какой-то волшебный новый маршрут ресурсов. Вы можете просто определить его отдельно. Route :: resource ('message', 'MessagesController'); Route :: get ('message/inbox', 'MessagesController @ inbox'); – Trip

Смежные вопросы