es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de slug en enrutamiento de Laravel: Excepción de llamada de método incorrecto.

Estoy intentando crear una ruta con tres segmentos, que incluyen la categoría, el nombre de la marca y el nombre del producto.

web.php

Route::get(‘/shop/{category:slug}/{brand:slug}/{product:slug}’, [ProductController::class, ‘index’]);

Controlador

<?php

namespace App\Http\Controllers;

use App\Brand;
use App\Category;
use App\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
public function index(Category $category, Brand $brand, Product $product)
{
$product = Product::where(‘id’, $product->id)->with(‘related’, function($q) {
$q->with(‘brand’)->with(‘categories’);
})->with(‘brand’)->first();

    return view('product', compact('product', 'category'));
}

}

Por alguna razón, obtengo este error, que no entiendo por qué.

BadMethodCallException Llamada a un método indefinido de App\Category::brands()

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no existe un método llamado “brands” en el modelo Category. Esto es probablemente porque en la clase “ProductController”, estás intentando utilizar la relación “brand” en el modelo “category” con el método with(), pero esta no existe.

    Para solucionar esto, puedes actualizar el modelo “Category” para incluir una relación con el modelo “Brand”. En la clase del modelo Category, agrega el siguiente método:

    public function brand()
    {
        return $this->belongsTo(Brand::class);
    }
    

    Con esta relación, entonces puedes actualizar la clase “ProductController” para incluir esta relación cuando se carga el producto:

    $product = Product::where('id', $product->id)
                      ->with('related', function($q) {
                            $q->with('brand')->with('categories.brand');
                        })
                      ->with('brand')
                      ->first();
    

    Observa que también incluimos la relación “brand” en la relación “categories” de los productos “relacionados”.

    Con estas actualizaciones, deberías de poder acceder a la relación de marca de la categoría sin errores.

Comments are closed.