Tengo tres modelos: productos, categoría, categoría_producto. Un producto puede tener muchas categorías, y algunas categorías pueden tener un padre. Puede encontrar las relaciones relacionadas a continuación. Podría mostrar todas las categorías con un bucle foreach(), pero no quiero hacer eso. Solo deseo mostrar la categoría, y debe ser la última. ¿Hay alguna manera de mostrar solo la última categoría de una categoría principal del producto actual?

<div class="row">
    @foreach ($products as $product)
        @foreach ($product->categories as $cat)
            {{ $cat->title }}
        @endforeach
    @endforeach
</div>

Modelo de producto

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

Modelo de categoría

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

public function subcategories()
{
    return $this->hasMany('\App\Category', 'parent_id');
}

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

Esquema de categorías

$table->increments('id');
$table->string('title');
$table->integer('parent_id')->nullable();

Esquema de producto de categoría

$table->increments('id');
$table->integer('category_id')->unsigned();
$table->integer('product_id')->unsigned();
0
devmrh 9 may. 2019 a las 19:25

4 respuestas

La mejor respuesta

Puede usar el generador de consultas en la relación de la siguiente manera:

$product->categories->orderBy('id', 'desc')->first();

Eso ordenará de más reciente a más antiguo y puede tomar el primer registro.

2
party-ring 9 may. 2019 a las 16:32

Simplemente puedes usar

$product->categories()->orderBy('id', 'DESC')->first();

O también puedes probar

 public function categories()
    {
        return $this->belongsToMany(Category::class)->orderBy('id','DESC');
    }

Entonces puedes usar

$product->categories()->first();



0
Adnan Mumtaz 9 may. 2019 a las 16:41

Usando métodos específicos en su modelo

Su definición de categorías sería algo como esto, ¿verdad?

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

Entonces, solo cree otro método para recuperar solo el último.

public function latestCategory() {
    return $this->categories()->latest();
}

Si necesita la categoría más antigua, se aplica el mismo enfoque.

public function oldestCategory() {
    return $this->categories()->oldest();
}

Usando solo la definición de relación de categorías

También podría aplicar un enfoque diferente si no tiene la intención de crear nuevos métodos:

$this->categories()->latest();

O

$this->categories()->oldest();

Espero que te ayude. Que tengas un gran día.

0
Marlon Ferreira 9 may. 2019 a las 17:51

Puedes usar el método latest()

$product->categories->latest()->first();

O,

$product->categories->orderBy('id', 'desc')->first();

0
Nayeem Azad 10 may. 2019 a las 10:19
56063785