为 "Many to Many" 插入数据
Insert data for "Many to Many"
我正在为图书馆开发管理面板。我需要插入更多作者的书。我在我的控制器中插入了图书/但我不明白如何从 BooksController 将作者 i 插入 table "authors",条件是我需要检查,我的作者在table如果还有不补充的。
BooksController 的代码:
public function insert(Request $request)
{
$BookName = $request->input('bookname');
if(!empty($BookName)){
$NewBook = new Books;
$NewBook->name = $BookName;
$BookFile = $request->file('books_file');
if(!empty($BookFile)){
$NewBook->img = $BookFile->getClientOriginalName();
$BookFile->move( storage_path('images/books/'), $BookFile->getClientOriginalName());
}
$NewBook->save();
$AuthorsNames = $request->input('authors');
if(!empty($AuthorsNames)){
$AuthorsFiles = $request->file('authfiles');
}
return "Scs";
}else{
return 'Enter book title';
}
}
我阅读了有关必要功能的文档,但我不明白如何使用它们。在我的代码中,我接受了一组作者,因为一本书可以有很多作者。我将非常感激的不是代码,而是必要的功能和如何使用它们的解释。
Laravel 文档对此进行了详细介绍。
https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships
附加/分离
Eloquent 还提供了一些额外的帮助方法,以便更方便地使用相关模型。例如,假设一个用户可以有多个角色,一个角色可以有多个用户。要通过在连接模型的中间 table 中插入记录来将角色附加到用户,请使用附加方法:
$user = App\User::find(1);
$user->roles()->attach($roleId);
将关系附加到模型时,您还可以传递一组附加数据以插入中间 table:
在您的示例中,作者应该已经存在,因为多对多关系意味着您在书中有一本书 table,作者在作者 table 中,并且两个主键 ( id) link 中间 table.
如果作者还不存在,保存作者并获取id并使用attach将他们的id添加到书中。 Book 模型不应该关心作者姓名,只关心 ID。
作者和书籍在您 link 之前应被视为完全独立的。因此,应单独创建一本书,并应单独创建一个作者,然后 link 他们。换句话说,你真的不应该从 BookController 创建作者,但如果你想,像创建任何其他模型一样创建一个作者模型,比如 $author = Author::create($data)
,然后使用 $book->authors()->attach($author->id)
附加它
我看到你的结构的主要问题是你怎么知道作者是否已经存在?两个不同的作者可以共享相同的名字。理想情况下,我建议将 ID 传递给 BookController,而不是名称。
基本上你需要另外两个 table 除了你的书 table,一个是作者 table,为此你需要为你的作者创建一个模型 class 和有了它你可以添加作者。还有一个主元 table authors_books,因为它是多对多关系。
Author::create(['name' => $name,....]);
和
Schema::create('authors_books', function (Blueprint $table) {
$table->increments('id');
$table->integer('author_id')->unsigned();
$table->integer('book_id')->unsigned();
$table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
$table->timestamps();
});
你可以添加到主元 table:
DB::table('authors_books')->insert(
['author_id' => $author, 'book_id' => $book_id]
);
我正在为图书馆开发管理面板。我需要插入更多作者的书。我在我的控制器中插入了图书/但我不明白如何从 BooksController 将作者 i 插入 table "authors",条件是我需要检查,我的作者在table如果还有不补充的。 BooksController 的代码:
public function insert(Request $request)
{
$BookName = $request->input('bookname');
if(!empty($BookName)){
$NewBook = new Books;
$NewBook->name = $BookName;
$BookFile = $request->file('books_file');
if(!empty($BookFile)){
$NewBook->img = $BookFile->getClientOriginalName();
$BookFile->move( storage_path('images/books/'), $BookFile->getClientOriginalName());
}
$NewBook->save();
$AuthorsNames = $request->input('authors');
if(!empty($AuthorsNames)){
$AuthorsFiles = $request->file('authfiles');
}
return "Scs";
}else{
return 'Enter book title';
}
}
我阅读了有关必要功能的文档,但我不明白如何使用它们。在我的代码中,我接受了一组作者,因为一本书可以有很多作者。我将非常感激的不是代码,而是必要的功能和如何使用它们的解释。
Laravel 文档对此进行了详细介绍。
https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships
附加/分离
Eloquent 还提供了一些额外的帮助方法,以便更方便地使用相关模型。例如,假设一个用户可以有多个角色,一个角色可以有多个用户。要通过在连接模型的中间 table 中插入记录来将角色附加到用户,请使用附加方法:
$user = App\User::find(1);
$user->roles()->attach($roleId);
将关系附加到模型时,您还可以传递一组附加数据以插入中间 table:
在您的示例中,作者应该已经存在,因为多对多关系意味着您在书中有一本书 table,作者在作者 table 中,并且两个主键 ( id) link 中间 table.
如果作者还不存在,保存作者并获取id并使用attach将他们的id添加到书中。 Book 模型不应该关心作者姓名,只关心 ID。
作者和书籍在您 link 之前应被视为完全独立的。因此,应单独创建一本书,并应单独创建一个作者,然后 link 他们。换句话说,你真的不应该从 BookController 创建作者,但如果你想,像创建任何其他模型一样创建一个作者模型,比如 $author = Author::create($data)
,然后使用 $book->authors()->attach($author->id)
附加它
我看到你的结构的主要问题是你怎么知道作者是否已经存在?两个不同的作者可以共享相同的名字。理想情况下,我建议将 ID 传递给 BookController,而不是名称。
基本上你需要另外两个 table 除了你的书 table,一个是作者 table,为此你需要为你的作者创建一个模型 class 和有了它你可以添加作者。还有一个主元 table authors_books,因为它是多对多关系。
Author::create(['name' => $name,....]);
和
Schema::create('authors_books', function (Blueprint $table) {
$table->increments('id');
$table->integer('author_id')->unsigned();
$table->integer('book_id')->unsigned();
$table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
$table->timestamps();
});
你可以添加到主元 table:
DB::table('authors_books')->insert(
['author_id' => $author, 'book_id' => $book_id]
);