2016-05-26 9 views
1

複合キーを持つモデルをバインドしようとしています。私は私がするためにクラスを注入しています方法を見て、複合キーによるルートバインド

$router->bind('laptop', function ($company, $model) { 
    $laptop = ... select laptop where company=$company and ...; 
    return $laptop; 
}); 

を今:私は解決したいと私は定義し、今

Route::get('laptop/{company}/{model}', '[email protected]'); 

:私は私のルートを定義する最初の場所を見て、取りますコントローラにラップトップを取得する:関数に解決をテストするために:

function test(Laptop $laptop){ 
    return 'ok'; 
} 

はしかし、私は、次のエラーが発生します:

BindingResolutionException in Container.php line 839:

エラーが$router->bind('laptop'によって発生したと仮定します。これは、URL(「会社」または「モデル」)の一意のプレースホルダに一致する必要があるためです。私の場合、私は同時に両方を一致させる必要があるので、私は失われます。

Note: I am not using db/eloquent layer. This problem is focused in the way on how to resolve route binding with multiples keys representing an unique object.

私は何かが不足しているかどうかわかりません。ご提案いただきありがとうございます。

答えて

0

Laravelは雄弁なクエリで複合キーをサポートしていません。

両方の値と照合するには、laravelのクエリビルダーメソッドを使用する必要があります。 DB :: select() - > where() - > where() - > get();

上記の条件を選択してください。

+0

問題は雄弁レイヤーではなく、ルートロジックに問題があります。具体的にはルート経由で2つのキーを使ってバインドを解決する方法は? – manix

+0

"複合キーを持つモデルをバインドしようとしています。"これはモデルでコンポジットキーを使用していると言ったので、これはうまくいきません。ララベルはそれをサポートしていないので。 –

+0

はい、私はモデルを使用していますが、雄弁な文脈ではありません – manix

0

$router->bind('laptop', ...);をバインドする場合、ルートパラメータはRoute::get('{laptop}', ...);である必要があります。ラップトップにmodelcompanyの2つの可能性があります。

最も安全な方法は、あなたのコントローラ上のクエリのノートパソコンです:あなたは

Route::get('laptop/{company}/{model}', '[email protected]'); 

TestController.php

function test(Laptop $laptop, $company, $model){ 
    return $laptop->whereCompany($company)->whereModel($model)->first(); 
} 

別の解決策は、あなたのルートのパラメータにスラッシュが可能である:

Route::get('laptop/{laptop}', '[email protected]')->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); 
}