Laravel关系和使用push()方法


Laravel Relationships and using the push() method

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

基本上,我有一个"作者"页面的表单,可以在其中添加多个"书籍"。当然,"作者"和"书籍"模型具有一对多的关系。

根据拉拉维尔官方教程,您必须:

  1. 将所有输入数据添加到"作者"模型
  2. 创建"作者"模型并将其保存到数据库中
  3. 对于每个"书籍"输入数据
  4. 使用 $author->books((
  5. ->save($book( 创建每个"Book"模型并将其保存到数据库中;

Laravel还指出:"有时你可能不仅希望保存一个模型,还希望保存它的所有关系。为此,您可以使用 push 方法:$user->push((;">

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

我正在寻找这样的东西:

$author = new Author();
$author->name = "Bill Jobs";
$author->phone = "555 - 123456";
// fill model with relations
$author->addRelation($relationsArray)
if($author->push())
{ 
   // ....
}

更新"作者"也应该这样做:首先删除已经存储的关系,然后保存新关系

TLDR;您将在下面找到push描述,以及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();

这一次,关系分配正确,但仍然没有进行关联(分配外键(。因此,尽管author和所有books都将被保存/更新,但它们根本不会关联。

<小时 />

话虽如此,您需要自己关联模型并使用push或利用雄辩方法(createMany/saveMany(:

入手:

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

1 然后手动

// 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

对于创建许多:

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

首先删除已存储的关系,然后保存新关系

然后

$author->books()->delete(); // or if you are using soft delete forceDelete()
$author->books()->createMany($relationsArray);
您可以使用

推送方法更新图书和作者模型。

$book = Book::first();
$book->author->author_name = "Mark Twin";
$book->book_name = "Life On The Mississippi";
$book->push();

这是详细信息的链接[1]: https://medium.com/@JinoAntony/10-hidden-laravel-eloquent-features-you-may-not-know-efc8ccc58d9e