2016-07-03 11 views
0

) Ich habe Methode:Übertragungsvariable URL der Methode in Laravel

public function show($id){ 
$categories = Category::findOrFail($id); 
$productsList = Category::with(['products' => function ($query) { 
        $query->where(['category_id', 19]); 
       }])->get(); 
return view('categories.showcategory', compact('categories', 'productsList')); 
} 

Diese Methode gibt eine Liste der Produkte in der gewählten Kategorie zurückgegeben. Nummer 19 ist ausgewählte ID-Kategorie. Die URL zur Liste der Produkte in der ausgewählten Kategorie sieht so aus: www. [...] magazyn_michal/public/addcategory/Die Frage ist: Wie kann ich einen dynamischen Wert numerische ID Kategorie (19) der URL zur Methode ?? Ich versuche, diese (aber nicht):

public function show($id){ 
$categories = Category::findOrFail($id); 
$productsList = Category::with(['products' => function ($query) { 
        $query->where(['category_id' => $categories->id]); 
       }])->get(); 
return view('categories.showcategory', compact('categories', 'productsList')); 
} 

Laravel zurückgegeben:

Undefined variable: Kategorien

auch auf diese Weise nicht funktioniert:

public function show($id){ 
$categories = Category::findOrFail($id); 
$productsList = Category::with(['products' => function ($query) { 
        $query->where('category_id', Input::get('category_id')); 
       }])->get(); 
return view('categories.showcategory', compact('categories', 'productsList')); 
} 

Laravel kommt nichts zurück. Leere Liste der Produkte in der ausgewählten Kategorie.

routes.php Datei:

Route::get('/', '[email protected]'); 
Route::get('/contact', '[email protected]'); 
Route::resource('/addarticle', 'ArticlesController'); 
Route::resource('/addcategory', 'CategoriesController'); 
Route::resource('/listcategory', '[email protected]'); 
Route::resource('/warehouse', 'ProductsController'); 
Route::auth(); 
Route::get('/home', '[email protected]'); 

Modell category.php:

public function products(){ 
    return $this->hasMany('App\Product'); 
} 

Modell product.php:

public function category(){ 
    return $this->belongsTo('App\Category'); 
} 

ich dies mit: https://laravel.com/docs/5.2/eloquent-relationships#constraining-eager-loads

+1

Sie benötigen eine Route zu veröffentlichen, damit wir sehen können, wie es Setup ist –

+0

@ Rob Fonseca ich meinen Beitrag zu aktualisieren – major697

+0

Haben Sie dd ($ Kategorien) in Ihrem Controller, um sicherzustellen, es ist eigentlich einen aus der Datenbank ziehen? Nichts scheint falsch mit Ihrer Route, Methodendefinition und ziehen Sie die Kategorie aus dem Modell, also wollen Sie sicherstellen, dass Sie tatsächlich eine Kategorie zuerst bekommen. –

Antwort

0

OK ich reparieren dieses Problem.Nun, es funktioniert;)

public function show($id){ 
$categories = Category::findOrFail($id); 
$categoryID = Input::get('category_id'); 
$productsList = Category::with(['products' => function ($query) use($id) { 
        $query->where('category_id', '=' ,$id); 
       }])->get(); 
return view('categories.showcategory', compact('categories', 'productsList')); 
} 
1

Sie sollte r verwenden Oute-Model-Bindung in dieser Situation. Sie können Ihre Route /categories/19 das Objekt Category statt nur eine ID zurückgeben lassen. Dies könnte bereits geschehen, was zu Fehlern führt, wenn Sie findOrFail anrufen.

Check out: https://laravel.com/docs/master/routing#route-model-binding

Sie sollten auch Laravel Beziehungen nutzen, so können Sie diese Funktion in Ihrem Category Klasse setzen können:

public function products(){ 
    return $this->belongsToMany('App\Product'); 
} 

Mehr lesen über die Beziehungen: https://laravel.com/docs/master/eloquent-relationships

Wenn Sie das tun Bei beiden wird Ihre Controller-Methode wie folgt aussehen:

public function show(Category $category){ 
    $products = $category->products; 
    return view('categories.showcategory', compact('category', 'products')); 
} 
+0

Ich habe meinen Beitrag aktualisiert – major697

+0

Sie müssen keine Unterabfrage verwenden, um nach den Produkten zu suchen . Die Beziehung sucht automatisch nach Produkten mit der richtigen 'category_id', also können Sie einfach' $ productList = $ category-> products; '. Sehen Sie sich auch die Dokumentation für die Routenmodellbindung an. Der Abschnitt "Explizite Bindung" ist das, was Sie tun müssen, um das Objekt "Kategorie" anstelle der ID zu erhalten. – Jeff

1

Ich denke, ich habe es basierend auf allen Tests, die Sie mir gezeigt haben. $ categories ist in der Abfrage nicht enthalten. Versuchen Sie folgendes:

public function show($id){ 
$categories = Category::findOrFail($id); 
$productsList = Category::with(['products' => function ($query) use ($categories) { 
        $query->where('category_id', $categories->id) 
       }])->get(); 
return view('categories.showcategory', compact('categories', 'productsList')); 
} 

Die Verwendung Erklärung setzt Kategorien in Rahmen Ihrer anonymen Funktion