тлдр; Ниже вы найдете 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_key
равно null
, потому что $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
ИЛИ использовать методы Eloquent (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
person
Jarek Tkaczyk
schedule
05.12.2014