Переменные привязки маршрута Laravel 5 недоступны в построителе запросов

Я использую привязку маршрута, чтобы определить, связана ли каждая часть URL с предыдущей. Я пытаюсь получить доступ к параметру / переменной маршрута ($ stage_number) в моем конструкторе запросов, но безуспешно. Чтобы запутать вещи, если я заменяю переменную жестким значением, это работает, например. 4

Как использовать переменную $ stage_number в моем запросе?

/*
* Route
*/
Route::get('/application/{application_id}/stage/{stage_number}', [
'as' => 'application.stage',
'uses' => 'ApplicationController@stage'
]);

/*
* Route Service Provider
*/
// Application
$router->bind('application_id', function($application_id)
{
$application = Application::find($application_id);

if (! $application)
{
abort(404);
}

return $application;
});

// Stage
$router->bind('stage_number', function($stage_number)
{
$application = $this->getCurrentRoute()->application_id;

$stage = collect($application->stages)->where('order', $stage_number)->all();

if (! $stage)
{
abort(404);
}

return $stage;
});

Обновление в ответ на patricus:

Спасибо за информацию о звонке where() на коллекции; Я не осознавал, что он обрабатывается по-другому для создателя запросов. Обновление моего where() за сборник работает отлично — спасибо. Тем не менее, у меня все еще возникают проблемы при использовании построителя запросов:

// Route with data
/application/1/stage/4

// Actual data returned
array:4 [▼
0 => array:2 [▼
"name" => "Information about the University or Education Course""order" => 3
]
1 => array:2 [▼
"name" => "Information about your education to date""order" => 4
]
2 => array:2 [▼
"name" => "Other Information""order" => 5
]
3 => array:2 [▼
"name" => "Declaration""order" => 6
]
]

// Desired data to be returned
array:1 [▼
0 => array:2 [▼
"name" => "Information about your education to date""order" => 4
]
]

Независимо от того, что order Я указываю в своем маршруте, я, кажется, получить все, что возвращается is not null если я не выберу 1 или же 2 (которые являются строками без порядкового номера и исключены из приведенного выше примера массива), а затем я возвращаю эту строку со всеми другими строками, которые is not null (как показано в примере выше), но любой другой null строки исключены. Это проблема, вызванная отношениями на моем Application объект?

public function stages()
{
return $this->hasMany('App\Entities\Application\Stage', 'type_id')->orWhereNull('type_id')->orderBy('order', 'asc');
}

Обновить:

Настройка foreign_key а также local_key На мои отношения, казалось, решили другие вопросы:

public function stages()
{
return $this->hasMany('App\Entities\Application\Stage', 'type_id', 'type_id')->orWhereNull('type_id')->orderBy('order', 'asc');
}

0

Решение

Вы на самом деле звоните where() метод на Collection объект, а не на Builder объект.

where() метод на Collection работает немного по-другому. Во-первых, он может сделать только сравнение. Во-вторых, по умолчанию это строгое равенство (===) сравнение, и это ваша проблема. Так как ваш $stage_number это строка, и ваш order Поле, скорее всего, является целым числом, строгое сравнение не возвращает никаких результатов.

Вы можете изменить сравнение на свободные равные (==) мимоходом false в качестве третьего параметра. Вы также можете использовать whereLoose() метод, который делает то же самое.

Также обратите внимание, предполагая, что stages это hasMany или же belongsToMany отношения на Application объект, нет необходимости для вызова collect(), $application->stages уже вернет Collection,

// pass false as third parameter
$stage = $application->stages->where('order', $stage_number, false)->all();

// or use whereLoose
$stage = $application->stages->whereLoose('order', $stage_number)->all();

Теперь, сказав все это, вы, вероятно, хотите позвонить where() на построителе запросов. В то время как $application->stages даст Collection связанных сценических объектов, $application->stages() возвращает Relation объект для отношений, который дает вам доступ к построителю запросов. Поскольку у вас есть доступ к компоновщику, вы можете добавить условие where к выполняемому запросу и обеспечить повышение производительности (а также не заботиться о типе переменной).

$stage = $application->stages()->where('order', $stage_number)->get();

Обратите внимание, что get() вернет Collection объект, который содержит соответствующие объекты стадии. Если order является уникальным, и вы хотите получить этот одноэтапный объект, вы можете использовать first() вместо get():

$stage = $application->stages()->where('order', $stage_number)->first();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector