Laravel关系并使用push()方法

Tud*_*oiu 0 php entity-relationship laravel eloquent laravel-4

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

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

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

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

Laravel还指出"有时您可能希望不仅保存模型,还保存其所有关系.为此,您可以使用push方法:$ 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())
{ 
   // ....
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*zyk 6

tldr; 你会发现push之间的下面的说明,以及区别createManysaveMany关系mothods

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

$author = new Author;
$book = new Book;
$book->author()->associate($author);
$author->push();
Run Code Online (Sandbox Code Playgroud)

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

$child->foreign_key = $parent->primary_key;
Run Code Online (Sandbox Code Playgroud)

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


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

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

$author->books = $books;
$author->push();
Run Code Online (Sandbox Code Playgroud)

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

$author = Author::first();
$books = Book::get(); 

$author->setRelation('books', $books);
$author->push();
Run Code Online (Sandbox Code Playgroud)

这次,关系被正确分配,但仍未建立关联(分配外键).因此,尽管两者authorbooks将被保存/更新,但它们根本不会相关联.


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

从...开始:

$author = Author::find($someId);
// delete existing books
$author->books()->delete();
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

2或createMany:

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

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
Run Code Online (Sandbox Code Playgroud)