插入“多对多”的数据

时间:2017-12-05 12:07:11

标签: php laravel laravel-5.5

我正在为图书馆开发一个管理面板。我需要插入更多作者的书。我在我的控制器中插入书本插件/但我不明白我如何将作者i插入BooksController中的表“作者”,条件是我需要检查,表中有我的这样的作者,如果没有加上。 BooksController的Thath代码:

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';
    }
}

我阅读了有关必要功能的文档,但我不明白如何使用它们。在我的代码中,我接受了一系列作者,因为一本书可以有很多作者。我将非常感谢代码,但对于必要的功能以及如何使用它们的解释。

2 个答案:

答案 0 :(得分:2)

Laravel文档详细介绍了这一点。

https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

附加/分离

Eloquent还提供了一些额外的辅助方法,使相关模型的使用更加方便。例如,让我们想象一个用户可以拥有多个角色,一个角色可以拥有许多用户。要通过在连接模型的中间表中插入记录来将角色附加到用户,请使用attach方法:

$user = App\User::find(1);

$user->roles()->attach($roleId);

将关系附加到模型时,您还可以传递要插入到中间表中的其他数据数组:

在您的示例中,作者应该已经存在,因为多对多的关系意味着您在books表中有一本书,authors表中的作者,以及在中间表中链接的两个主键(id)。

如果作者尚不存在,请保存作者并获取ID并使用attach将其ID添加到书中。 Book模型不应该关心作者姓名,只关心ID。

作者和书籍应该被认为是完全独立的,直到你链接它们为止。因此,应该单独创建一本书,并且应该单独创建一个作者,然后链接它们。换句话说,你真的不应该从BookController创建作者,但是如果你想创建一个像其他任何作者一样的作者模型,比如$author = Author::create($data),那么用{{1}来附加它。 }}

我在您的结构中看到的主要问题是您如何知道作者是否已经存在?两位不同的作者可以使用相同的名称。理想情况下,我建议将ID传递给BookController,而不是名称。

答案 1 :(得分:1)

基本上你需要在书桌旁边另外两张表,一张是作者表,你需要为你的作者创建一个模型类,你可以添加作者。和一个数据透视表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();
    });

您可以添加到数据透视表:

DB::table('authors_books')->insert(
            ['author_id' => $author, 'book_id' => $book_id]
        );