Хотите настроить красноречивые отношения между тремя таблицами

#php #laravel #laravel-8

#php #laravel #laravel-8

Вопрос:

Я работаю на Laravel 8 с Jetstream — Livewire, хочу настроить красноречивые отношения между тремя таблицами. Это категория, подкатегория и пункт меню. 1 категория имеет много подкатегорий, тогда как 1 подкатегория имеет только 1 категорию. в 1 подкатегории много пунктов меню, тогда как в 1 пункте меню есть только 1 подкатегория. Как мне поступить со следующим, в основном с вышеупомянутыми отношениями Я хочу создать функциональность CRUD со всеми тремя таблицами в одном блейд-представлении, пожалуйста, направьте меня. Пожалуйста, проверьте таблицу ниже.

 Category Table
-----------------------
id
category_name

Sub Category Table
-----------------------
id
category_id
sub_category_name

Menu Item Table
-----------------------
id
sub_category_id
item_name
item_description
  

Ответ №1:

В качестве вашей текущей структуры отношения будут такими, как показано ниже

Таблица категорий

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Category extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fillable_values_here'
    ];

    public function subCategories() {
        return $this->hasMany(SubCategory::class, 'category_id');
    }

    public function menus() {
        return $this->hasManyThrough(
            'Menu::class',
            'SubCategory::class',
            'category_id',
            'sub_category_id'
        );
    }
}
  

Модель подкатегории

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class SubCategory extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fillable_values_here'
    ];

    public function category() {
        return $this->belongsTo(Category::class, 'category_id');
    }

    public function menus() {
        return $this->hasMany(Menu::class, 'sub_category_id');
    }
}
  

Модель меню

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Menu extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fillable_values_here'
    ];

    public function subCategory() {
        return $this->belongsTo(SubCategory::class, 'sub_category_id');
    }
}
  

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

Комментарии:

1. Спасибо, чувак, кажется, это работает, мне просто нужно попробовать, просто нужно спросить, как мне формировать миграции, боюсь, я не очень привык к миграциям и назначению внешних идентификаторов. Если вы можете мне помочь с этим, это было бы здорово! Еще раз спасибо. 🙂

2. выполните миграцию с помощью модели с помощью команды php artisan make:model ModelName -m . это создаст как модель, так и миграцию. а затем добавьте имена ваших столбцов в файл миграции. и моделируйте код, как я ответил. полную ссылку на миграцию можно найти в документе .

3. Большое спасибо, брат, это отлично работает! Это к делу. 🙂

4. вы хотите правильно отобразить название категории пунктов меню?? для этого вам не нужно использовать какой-либо цикл. просто используйте отношения, такие как $menuitem->subCategory->sub_category_name

5. просмотрите документ laravel. это вам очень поможет. удачи.

Ответ №2:

Для Category : это самоссылающееся отношение «один ко многим».

Вам не нужна отдельная таблица для подкатегорий. Им можно легко управлять с помощью одной Category таблицы.

Ваша Category схема таблицы может выглядеть следующим образом:

 id
category_title
category_id (default: null)
  

Где category_id родительский элемент определенной категории.

category_id является внешним ключом для самого себя (таблица категорий). Следовательно, самообновляющиеся отношения. По умолчанию для него установлено значение null, что означает, что это корневой родительский элемент и у него нет родительского элемента.

Пример:

 id       category_title                category_id (or parent_id)

1        Welcome Drinks On Arrival       null
2        Essentials                       1
3        Mocktails                        1
  

Комментарии:

1. parent_category_id вероятно, было бы лучшим именем. Кроме того, вам не нужно значение по умолчанию 0 , потому что база данных будет жаловаться, когда ограничение внешнего ключа не будет выполнено. По умолчанию null было бы лучше.

2. На самом деле мне нужна подкатегория для функции, я создаю главное меню для событий, скажем, Category as Welcome Drinks On Arrival , в котором есть подкатегории as Essentials , Mocktails , Fresh Fruit Juices а в подкатегориях есть несколько пунктов меню.