Как выполнить привязку модели маршрута к вычисляемому столбцу или области действия в Laravel? - PullRequest
0 голосов
/ 28 ноября 2018

Предположим, что в моей таблице 'слова' есть следующие данные:

+----+----------------+
+ id + Title          +
+ 1  + Lorem ipsum    +
+ 2  + Dolor sit amet +
+----+----------------+

Модель Word содержит следующую область действия:

// app/Models/Words.php
public function scopeByWords($query, $words)
{
    return $query->where('id', wordsToNumber($words));
}

Идея состоит в том, что example.com/one должновозвращаемый идентификатор строки 1, example.com/two должен возвращать идентификатор строки 2 и т. д.

Предполагая, что написаны функции wordsToNumber и numberToWords, как я могу выполнить привязку модели маршрута в этом случае?Следующий код не работает.Выдает 404.

// routes/web.php
Route::get('/{words}', 'WordsController@show');

// app/Providers/RoutingServiceProvider.php
Route::bind('words', function ($words) {
    return Word::byWords($words)->get() ?? abort(404);
});

Если я сделаю это вручную, я смогу вытащить строку:

// app/Http/Controllers/WordsController.php
public function show($words) {
    return Word::byWords($words)->get();
}

Я хочу знать, почему не работает следующее:

// app/Http/Controllers/WordsController.php
public function show(Word $words) {
    return $words;
}

Это, очевидно, пример проблемы, которую я хочу решить.Фактическое преобразование строки запроса в строку отличается.

1 Ответ

0 голосов
/ 29 ноября 2018

Я исправил это сам.Мне только нужно было заменить метод get(), который возвращает коллекцию, на first(), который возвращает один объект.

// app/Providers/RoutingServiceProvider.php
Route::bind('words', function ($words) {
    return Word::byWords($words)->first() ?? abort(404);
});

Это был действительно глупый недосмотр с моей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...