因此,当我想创建一个新蛋糕时,我需要使类别名称显示在下拉菜单中。
我在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>
答案 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)
。
如果我错了,请纠正我。