我正在尝试绑定具有复合键的模型。看一看,我首先定义了我的路线:
Route::get('laptop/{company}/{model}', 'TestController@test');
现在,我定义为我想要解决:
$router->bind('laptop', function ($company, $model) {
$laptop = ... select laptop where company=$company and ...;
return $laptop;
});
现在,我看到我是如何注入类以便将笔记本电脑放入控制器:函数来测试分辨率:
function test(Laptop $laptop){
return 'ok';
}
但是,我收到以下错误:
Container.php第839行中的BindingResolutionException:
我认为错误是由$router->bind('laptop'
引起的,因为它应匹配url(“company”或“model”)中的唯一占位符。在我的情况下,我迷路了,因为我需要同时匹配两者。
注意:我没有使用db / eloquent层。此问题的重点在于如何使用表示唯一对象的多个键来解析路径绑定。
我不确定是否可能,或者我是否遗漏了某些东西。提前感谢您的任何建议。
答案 0 :(得分:0)
Laravel在eloquent查询中不支持复合键。
您需要使用laravel的查询构建器方法来匹配这两个值。 ie:DB :: select() - > where() - > where() - > get();
只需将select和where条件放在上面。
答案 1 :(得分:0)
如果绑定$router->bind('laptop', ...);
,则您的路由参数应为Route::get('{laptop}', ...);
。有两种方法可以按照您的预期model
和company
查询笔记本电脑。
最安全的方法是在控制器上查询笔记本电脑:
Route::get('laptop/{company}/{model}', 'TestController@test');
在你TestController.php
function test(Laptop $laptop, $company, $model){
return $laptop->whereCompany($company)->whereModel($model)->first();
}
另一种解决方案是在路线参数上允许斜杠:
Route::get('laptop/{laptop}', 'TestController@test')->where('laptop', , '(.*)?');
你的绑定功能可能是:
$router->bind('laptop', function ($laptop) {
$laptop = explode('/', $laptop);
$company = current($laptop);
$model = end($laptop);
if ((count($laptop) === 2) && ($result = App\Laptop::whereCompany($company)->whereModel($model)->first()) {
return $result;
}
return abort(404);
}