Laravel 6 не может отображать названия предметов из другой таблицы - PullRequest
2 голосов
/ 27 октября 2019

Поэтому, когда я хочу создать новый торт, мне нужно, чтобы названия категорий отображались в раскрывающемся списке. Я установил отношения hasMany между Category.php и Cake.php.

В настоящее время я могу получить только category_id в значении параметра, но не название категории.

Category.php : Где яобъявленные отношения.


namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $guarded = [];


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

}

CreateCakesTable.php

<?php

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

class CreateCakesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cakes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('description');
            $table->decimal('price');
            $table->integer('size');
            $table->boolean('published')->default(false);
            $table->unsignedInteger('category_id');
            $table->string('image')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cakes');
    }
}

CreateCategoriesTable.php

<?php

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

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

create.blade.php

<div class="form-group">
    <label for="category_id" @error('category_id') class="text-danger" @enderror>Categorie</label>
    <select class="form-control @error('category_id') is-invalid @enderror" name="category_id" id="category_id">
        <option disabled selected value> -- Selecteer een categorie -- </option>
        @foreach ($cake as $cake)
        <option value="{{ $cake->category->id ?? '' }}">{{ $cake->category->name ?? 'Geen categorie'}}</option>
        @endforeach

    </select>
    @error('category_id')
    <span class="invalid-feedback d-block" role="alert">
        <strong>{{ $message }}</strong>
    </span>
    @enderror
</div>

Ответы [ 3 ]

0 голосов
/ 27 октября 2019

Во-первых, если у вас есть отношение hasMany, вы должны назвать его множественным именем в вашем случае cake должно быть cakes, а в вашем утверждении это неправильно, я думаю, потому что имя массива $cake совпадает сэто единственный элемент $cake в вас, например:

@foreach ($cake as $cake)

Сделайте так:

@foreach ($cakes as $cake)

и измените его с вашего контроллера, где вы передали его для просмотра.

0 голосов
/ 27 октября 2019

В category.php , изменить:

return $this->hasMany(Cake::class, 'category_id', 'id');

Кому:

return $this->hasMany('App\Cake', 'category_id', 'id');

Другоймодель должна вернуть:

return $this->belongsTo('App\Category');.

Это определит отношения правильно. Если вы посетите документ Laravel Eloquent , вы увидите, что он использует запись App\Example вместо Example::class. Это менее запутанно и менее подвержено ошибкам.

Также убедитесь, что ваш цикл @foreach правильный. Отправьте переменную $cakes в представление, чтобы цикл foreach выглядел следующим образом: @foreach($cakes as $cake).

Исправьте меня, если я ошибаюсь.

0 голосов
/ 27 октября 2019

Полагаю, вы не определили отношения на модели Cake. Вот почему вы получаете сообщение об ошибке вообще ничего.

Я бы изменил модель и класс миграции, как показано ниже. (Я предполагаю, что торт может принадлежать только к одной категории)

Модель торта

class Cake extends Model
{
    public function category()
    {
        return $this->belongsTo('App\Category');
    }

}

Миграция тортов

class CreateCakesTable extends Migration
{
    public function up()
    {
        Schema::create('cakes', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('description');
            $table->decimal('price');
            $table->integer('size');
            $table->boolean('published')->default(false);
            $table->integer('category_id')->unsigned();
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
            $table->string('image')->nullable();
            $table->timestamps();
        });
    }
}

После того, как вы отредактировали файл миграции, запустите

php artisan migrate:refresh --seed

Предупреждение : имейте в виду, что он удалит все данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...