Получить список категорий и подкатегорий с помощью построителя запросов - PullRequest
0 голосов
/ 18 октября 2019

Как получить список категорий и подкатегорий, таких как:

1 мобильный

  • яблоко

  • Samsung

  • Nokia

2: Ноутбуки

  • Mac

  • HP

  • Dell

  • Sony

3: телевизоры

  • Samsung

с использованием построителя запросов в контроллере и в цикле foreach в представлении

Мой контроллер

$sub_catagories = DB::table('books_categories')
->join('sub_catagories','sub_catagories.catId','=','books_categories.catId')->get();
return view('index',compact('sub_catagories'));

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

    public function up()
    {
        Schema::create('books_categories', function (Blueprint $table) {
            $table->increments('catId');
            $table->string('catName', 50)->nullable(false);
            $table->timestamps();
        });
    }

Моя подкатегория таблицы

    public function up()
    {
        Schema::create('sub_catagories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('catId');
            $table->timestamps();
        });
    }

1 Ответ

1 голос
/ 19 октября 2019

Я написал несколько примеров всего цикла. В laravel существует соглашение об использовании уникальных идентификаторов автоинкремента и внешних ключей, таких как RELATION_id. Поэтому, если вы все равно хотите изменить имена таблиц и столбцов, вы можете сделать это с помощью следующего примера:

Категория Модель

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories';

    protected $fillable = [
        'id',
        'name',
    ];

    public function subcategories(){
        return $this->hasMany(Subcategory::class, 'category_id', 'id');
    }
}

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Subcategory extends Model
{
    protected $table = 'subcategories';

    protected $fillable = [
        'id',
        'category_id',
        'name',
    ];

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

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

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoriesTable extends Migration
{
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            // PRIMARY
            $table->bigIncrements('id');
            // ADDITIONAL
            $table->string('name');
            // TIME
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

таблица подкатегорий Миграция

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSubcategoriesTable extends Migration
{
    public function up()
    {
        Schema::create('subcategories', function (Blueprint $table) {
            // PRIMARY
            $table->bigIncrements('id');
            // FOREIGN
            $table->unsignedBigInteger('category_id')->nullable();
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade')->onUpdate('cascade');
            // ADDITIONAL
            $table->string('name');
            // TIME
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('subcategories');
    }
}

использование в контроллере

// 1
public function categories()
{
    $categories = Category::all()->get();

    return view('categories', [
        'categories' => $categories,
    ]);
}
// 2
public function catsWithSubcats()
{
    $cats_with_subcats = Category::with('subcategories')->get();

    return view('cats_with_subcats', [
        'categories' => $cats_with_subcats,
    ]);
}
// 3
public function subcatsWithCats()
{
    $subcats_with_cats = Subcategory::with('category')->get();

    return view('subcats_with_cats', [
        'subcategories' => $subcats_with_cats,
    ]);
}

Если вы хотите показать все категории с их подкатегориями в блейде, вам не нужно использовать 2-й или 3-й метод, просто используйте 1-й метод. Создайте "Categories.blade.php" внутри "resources / views / ..." и напишите там что-то вроде этого:

@foreach($categories as $category)
    @foreach($category->subcategories as $subcategory)
        <p>{{ $subcategory->name }}</p>
    @endforeach
@endforeach
...