Показывать только последнюю категорию продукта в Laravel 5.8

У меня есть три модели: продукты, категория, product_category. У продукта может быть много категорий, и у некоторых категорий может быть родитель. Вы можете найти связанные отношения ниже. Я мог бы показать все категории с помощью цикла foreach(), но я не хочу этого делать. Я хочу только показать категорию, и она должна быть последней. Есть ли способ показать только последнюю категорию родительской категории текущего продукта?

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

Модель продукта

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

Категория модели

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');
}

Схема категорий

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

Схема Category_product

$table->increments('id');
$table->integer('category_id')->unsigned();
$table->integer('product_id')->unsigned();

person devmrh    schedule 09.05.2019    source источник


Ответы (4)


Вы можете использовать построитель запросов для таких отношений:

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

Это будет отсортировано от самого последнего к самому старому, и вы можете просто взять первую запись.

person party-ring    schedule 09.05.2019

Вы можете просто использовать

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

Или вы также можете попробовать

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

Тогда вы можете использовать

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



person Adnan Mumtaz    schedule 09.05.2019

Использование определенных методов на вашей модели

Ваше определение категорий будет примерно таким, верно?

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

Итак, просто создайте другой метод для получения только самых последних.

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

Если вам нужна самая старая категория, применяется тот же подход.

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

Использование только определения отношения категорий

Вы также можете применить другой подход, если не собираетесь создавать новые методы:

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

or

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

Надеюсь, это поможет вам. Хорошего дня.

person Marlon Ferreira    schedule 09.05.2019

Вы можете использовать latest() метод

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

Or,

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

person Nayeem Azad    schedule 09.05.2019