首页 文章

Laravel关系并使用push()方法

提问于
浏览
0

我正在尝试找到一种不同的方法来保存/更新给定模型及其与数据库的关系 .

基本上我有一个“作者”页面的表格,可以添加多个“书籍” . 当然,“作者”和“书”模型具有一对多的关系 .

根据laravel官方教程,您必须:

  • 将所有输入数据添加到"Author"模型

  • 创建"Author"模型并将其保存到DB中

  • 对于每个"Book"输入数据

  • 使用$ author-> books() - > save($ book)创建每个"Book"模型并将其保存到数据库中;

Laravel还说"Sometimes you may wish to save not only a model, but also all of its relationships. To do so, you may use the push method: $user->push();" .

但我找不到任何关于如何用"Book"关系填充"Author"模型的教程,实际上使用 push() 方法

我正在寻找这样的东西:

$author = new Author();
$author->name = "Bill Jobs";
$author->phone = "555 - 123456";

// fill model with relations

$author->addRelation($relationsArray)

if($author->push())
{ 
   // ....
}

同样应该用于更新“作者”:首先删除已存储的关系,而不是保存新关系

2 回答

  • 0

    tldr;您将在下面找到推送描述,以及createMany和saveMany关系方法之间的区别

    Eloqeunt不处理延迟关系(例如Doctrine2),即 . 你不能这样做:

    $author = new Author;
    $book = new Book;
    $book->author()->associate($author);
    $author->push();
    

    因为关联完全正确,所以当你调用 associate 方法时 . 它所做的就是这样:

    $child->foreign_key = $parent->primary_key;
    

    所以在上面的情况中, primary_keynull ,因为 $author 尚未保存 .


    接下来,虽然 push 不是在文档中创建关联,但它可能会产生这样的印象,并且可能会想要这样做:

    $author = Author::first(); // existing parent
    $books = Book::get(); // existing children collection
    
    $author->books = $books;
    $author->push();
    

    但是,这也行不通 . 首先,Eloquent不允许您明确地分配关系,如上所述,那么,即使您正确地执行了此操作,仍然不会进行关联:

    $author = Author::first();
    $books = Book::get(); 
    
    $author->setRelation('books', $books);
    $author->push();
    

    这次,关系被正确分配,但仍未 Build 关联(分配外键) . 因此,尽管 author 和所有 books 都将被保存/更新,但它们根本不会相关联 .


    话虽如此,您需要自己关联模型并使用push OR exploit Eloquent方法(createMany / saveMany):

    从...开始:

    $author = Author::find($someId);
    // delete existing books
    $author->books()->delete();
    

    1然后 manually

    // for example:
    $booksInput = Input::get('books');
      // validate etc
    foreach ($booksInput as $bookArray)
    {
      $book = new Book;
      // assign the value from, eg.
      $book->fill($bookArray);
      $book->author()->associate($author);
      // or set FK explicitly
      $book->author_id = $author->getKey();
    
      // add to the author's collection
      $author->books->add($book);
    }
    
    $author->push(); // saves author and each of the books in separate queries
    

    2或 createMany

    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    $author->books()->createMany($booksAsArrays); // associate and save each book
    

    3或 saveMany

    $booksAsModels = []; // array of Book models
    $booksAsArrays = Input::get('books'); // array of arrays
    // validation
    
    foreach ($booksAsArrays as $bookArray)
    {
      $booksAsModels[] = new Book($bookArray);
    }
    $author->books()->saveMany($booksAsModels); // associate and save each book
    
  • 5

    为了创造许多:

    $author->books()->createMany($relationsArray);
    

    首先删除已存储的关系,而不是保存新关系

    然后

    $author->books()->delete(); // or if you are using soft delete forceDelete()
    $author->books()->createMany($relationsArray);
    

相关问题