为 "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]
        );