Mi Productcategory.php tiene

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

Y Product.php tiene

public function productcategory()
{
    return $this->belongsTo('App\Models\Productcategory', 'category_id');
}

Ahora mi ruta es

Route::get('gallery/{slug}', 'GalleryController@index');

Cuando la URL es algo así como gallery/print-pattern-client-work, ¿cómo puedo obtener todos los productos con la misma categoría? Tengo lo siguiente pero category_id es un número entero y no una babosa. Así que no estoy tan seguro de cómo hacerlo.

public function index()
{
    $categoryslug = Request::segment(2);
    $products = Productcategory::with('products')->where('category_id',$categoryslug)->get();
...
}
2
shin 27 dic. 2016 a las 12:31

3 respuestas

La mejor respuesta

Esto supone que tiene una columna llamada "babosa" en su tabla product_categories. Y que tus relaciones descritas funcionan bien.

Podrías hacer un descriptor de acceso en Product.php

public function scopeFindByCategorySlug($query, $categorySlug)
{
    return $query->whereHas('productcategory', function ($query) use ($categorySlug) {
        $query->where('slug', $categorySlug);
    });
}

Luego, en su controlador, llama a esto:

public function index(Request $request, $slug)
{
    $products = Product::findByCategorySlug($slug)->get();
}

Editar:

Como se menciona en los comentarios, no hay necesidad real de un descriptor de acceso. Esto es básicamente todo lo que necesitas (en el controlador):

public function index(Request $request, $slug)
{
    $products = Product::whereHas('productcategory', function ($query) use ($categorySlug) {
        $query->where('slug', $categorySlug);
    })->get();
}
5
DevK 27 dic. 2016 a las 09:53

Mientras usa Laravel, debe usar las Relaciones de muchas a muchas así:

La estructura de su tabla sería como:

- products
    - id
    - name
    - ...

- categories
    - id
    - name
    - slug
    - ...

- category_product
    - id
    - category_id
    - product_id
    - ...

Sus modelos deberían ser así:

class Product extends Model {

    public function categories() {
        $this->belongsToMany(Category::class, 'category_product');
    }

}

class Category extends Model {

    public function products() {
        $this->belongsToMany(Product::class, 'category_product');
    }

}

Y puede buscar todos los productos para un $category_slug particular como este:

$category = Category::where('slug', $category_slug)->first();
if($category) {
    $products = $category->products;
}
0
halfer 27 dic. 2016 a las 23:17

No

$categoryslug = Request::segment(2);

Utilice $slug

public function index($slug)
{
    $products = Productcategory::with('products')->where('category_id',$slug)->get();
...
}
1
Ilya Yaremchuk 27 dic. 2016 a las 09:47