尝试存储数据时未保存外键 Laravel 8
Foreign keys not saved when trying to store data Laravel 8
我正在尝试将作者和流派存储到一本书中。我试图实现这一目标的方法是拥有作者 table、类型 table 和书籍 table。我想将作者和流派的外键存储到书籍中 table。
我已经创建了一个表格来存储本书所需的信息。在表单中,有两个 select 标签,我在其中循环遍历 authors 和 genres 数组。我在我的 BookController 中使用存储函数来验证正在发送的数据。验证后,我存储了一本新书。
但是,除了主键、标题、简介和时间戳外,外键没有存储在数据库中。
图书模型
class Book extends Model
{
use HasFactory;
protected $fillable = [
'author_id',
'genre_id',
'title',
'blurb',
];
public function authors()
{
return $this->BelongsTo(Author::class);
}
public function genres()
{
return $this->BelongsTo(Genre::class);
}
}
作者模型
class Author extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
public function book()
{
return $this->hasMany(Book::class);
}
}
类型模型
class Genre extends Model
{
use HasFactory;
protected $fillable = [
'title'
];
public function book()
{
return $this->hasMany(Book::class);
}
}
BookController 创建()
public function create()
{
$authors = Author::all();
$genres = Genre::all();
return view('admin.book.create', ['authors' => $authors, 'genres' => $genres]);
}
BookController store()
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'authors' => 'required|array',
'genres' => 'required|array',
'blurb' => 'required',
]);
Book::create($validatedData);
return redirect()->route('admin.book.create');
}
书籍table迁移
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->foreignId('author_id');
$table->foreignId('genre_id');
$table->string('title');
$table->string('blurb');
$table->timestamps();
});
}
create.blade.php(创建图书页面)
<div class="flex justify-center">
<div class="flex justify-center border lg:w-1/4">
<div class="flex flex-col justify-center lg:w-2/4 gap-2">
<form action="{{ route('admin.book.store') }}" method="post">
@csrf
<div class="mb-2">
<h1 class="text-xl">Add Book</h1>
</div>
<div>
<label class="" for="title">Title</label>
<input name="title" class="w-10 border border-gray-400 w-full py-1 px-2" type="text">
</div>
<div>
<label class="" for="author">Author</label>
<select name="authors[]">
@foreach($authors as $author)
<option value="{{ $author->id }}">{{ $author->name }}</option>
@endforeach
</select>
</div>
<div>
<label class="" for="genre">Genre</label>
<select name="genres[]">
@foreach($genres as $genre)
<option value="{{ $genre->id }}">{{ $genre->title }}</option>
@endforeach
</select>
</div>
<div>
<label class="" for="blurb">Blurb</label>
<textarea name="blurb" id="" cols="18" rows="10"></textarea>
</div>
<div>
<button class="py-2 px-4 border" type="submit">Save</button>
</div>
</form>
</div>
</div>
</div>
编辑:
当我倾倒而死时:
array:5 [▼
"_token" => "WHlc2nvslN6l6iY4D8feeIzLEYzetMo3Ek0tLVPn"
"title" => "Harry Potter"
"authors" => array:1 [▼
0 => "1"
]
"genres" => array:1 [▼
0 => "4"
]
"blurb" => "Harry Potter is een zevendelige fantasyserie geschreven door de Britse schrijfster J.K. Rowling. De boeken volgen chronologisch de puberteit en de adolescentie ▶"
]
你必须这样做:
- 首先,In You Blade 将 authors[] 中的 select 名称转换为 author_id,将 genres[] 转换为 genre_id。
- 将验证中的作者和流派更新为上面的新名称。
我正在尝试将作者和流派存储到一本书中。我试图实现这一目标的方法是拥有作者 table、类型 table 和书籍 table。我想将作者和流派的外键存储到书籍中 table。
我已经创建了一个表格来存储本书所需的信息。在表单中,有两个 select 标签,我在其中循环遍历 authors 和 genres 数组。我在我的 BookController 中使用存储函数来验证正在发送的数据。验证后,我存储了一本新书。
但是,除了主键、标题、简介和时间戳外,外键没有存储在数据库中。
图书模型
class Book extends Model
{
use HasFactory;
protected $fillable = [
'author_id',
'genre_id',
'title',
'blurb',
];
public function authors()
{
return $this->BelongsTo(Author::class);
}
public function genres()
{
return $this->BelongsTo(Genre::class);
}
}
作者模型
class Author extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
public function book()
{
return $this->hasMany(Book::class);
}
}
类型模型
class Genre extends Model
{
use HasFactory;
protected $fillable = [
'title'
];
public function book()
{
return $this->hasMany(Book::class);
}
}
BookController 创建()
public function create()
{
$authors = Author::all();
$genres = Genre::all();
return view('admin.book.create', ['authors' => $authors, 'genres' => $genres]);
}
BookController store()
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'authors' => 'required|array',
'genres' => 'required|array',
'blurb' => 'required',
]);
Book::create($validatedData);
return redirect()->route('admin.book.create');
}
书籍table迁移
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->foreignId('author_id');
$table->foreignId('genre_id');
$table->string('title');
$table->string('blurb');
$table->timestamps();
});
}
create.blade.php(创建图书页面)
<div class="flex justify-center">
<div class="flex justify-center border lg:w-1/4">
<div class="flex flex-col justify-center lg:w-2/4 gap-2">
<form action="{{ route('admin.book.store') }}" method="post">
@csrf
<div class="mb-2">
<h1 class="text-xl">Add Book</h1>
</div>
<div>
<label class="" for="title">Title</label>
<input name="title" class="w-10 border border-gray-400 w-full py-1 px-2" type="text">
</div>
<div>
<label class="" for="author">Author</label>
<select name="authors[]">
@foreach($authors as $author)
<option value="{{ $author->id }}">{{ $author->name }}</option>
@endforeach
</select>
</div>
<div>
<label class="" for="genre">Genre</label>
<select name="genres[]">
@foreach($genres as $genre)
<option value="{{ $genre->id }}">{{ $genre->title }}</option>
@endforeach
</select>
</div>
<div>
<label class="" for="blurb">Blurb</label>
<textarea name="blurb" id="" cols="18" rows="10"></textarea>
</div>
<div>
<button class="py-2 px-4 border" type="submit">Save</button>
</div>
</form>
</div>
</div>
</div>
编辑: 当我倾倒而死时:
array:5 [▼
"_token" => "WHlc2nvslN6l6iY4D8feeIzLEYzetMo3Ek0tLVPn"
"title" => "Harry Potter"
"authors" => array:1 [▼
0 => "1"
]
"genres" => array:1 [▼
0 => "4"
]
"blurb" => "Harry Potter is een zevendelige fantasyserie geschreven door de Britse schrijfster J.K. Rowling. De boeken volgen chronologisch de puberteit en de adolescentie ▶"
]
你必须这样做:
- 首先,In You Blade 将 authors[] 中的 select 名称转换为 author_id,将 genres[] 转换为 genre_id。
- 将验证中的作者和流派更新为上面的新名称。