Laravel 6无法显示另一个表中的项目名称

时间:2019-10-27 00:07:34

标签: php laravel

因此,当我想创建一个新蛋糕时,我需要使类别名称显示在下拉菜单中。 我在hasManyCategory.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 :(得分:0)

我猜您没有在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

警告:请记住,它将删除所有数据。

答案 1 :(得分:0)

第一件事,如果您具有hasMany关系,那么在您的情况下,应将其命名为复数名称cake必须为cakes,并且您的语句中的错误我认为是因为数组名称{ {1}}与您以前的单项$cake相同:

$cake

像这样

@foreach ($cake as $cake)

,然后从您将其传递给视图的控制器中进行更改。

答案 2 :(得分:0)

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 docs,则会看到它使用App\Example表示法而不是Example::class。这种方式更不会混淆,也更不会出错。

还要确保您的@foreach循环正确。将变量$cakes发送到视图,使其foreach循环如下所示:@foreach($cakes as $cake)

如果我错了,请纠正我。