Я использую привязку маршрута, чтобы определить, связана ли каждая часть 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');
}
Вы на самом деле звоните 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();
Других решений пока нет …