#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
, в котором есть подкатегории asEssentials
,Mocktails
,Fresh Fruit Juices
а в подкатегориях есть несколько пунктов меню.