Tud*_*oiu 0 php entity-relationship laravel eloquent laravel-4
我正在尝试找到一种不同的方法来保存/更新给定模型及其与数据库的关系.
基本上我有一个"作者"页面的表格,可以添加多个"书籍".当然,"作者"和"书"模型具有一对多的关系.
根据laravel官方教程,您必须:
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)
同样应该用于更新"作者":首先删除已存储的关系,而不是保存新关系
push之间的下面的说明,以及区别createMany和saveMany关系mothodsEloqeunt不处理延迟关系(例如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_key中null,因为$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)
这次,关系被正确分配,但仍未建立关联(分配外键).因此,尽管两者author都books将被保存/更新,但它们根本不会相关联.
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)