Laravel Relationships и использование метода push ()

Я пытаюсь найти другой подход к сохранению / обновлению данной модели и ее отношений в базе данных.

По сути, у меня есть форма для страницы «Автор», где можно добавить несколько «Книг». Естественно, модели «Автор» и «Книга» имеют отношение один ко многим.

В соответствии с официальным руководством Laravel вы должны:

  1. Добавить все входные данные в модель «Автор»
  2. Создать и сохранить модель «Автор» в БД
  3. Для каждой «Книги» входные данные
  4. Создайте и сохраните каждую модель «Книги» в БД, используя $ author-> books () -> save ($ book);

Ларавел также утверждает, что «Иногда вам может понадобиться сохранить не только модель, но и все ее взаимосвязи. Для этого вы можете использовать метод push: $ user-> push ();».

Но я не смог найти учебник о том, как заполнить модель «Автор» отношениями «Книга» и фактически использовать От себя() метод

Я ищу что-то вроде этого:

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

// fill model with relations

$author->addRelation($relationsArray)

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

То же самое должно работать для обновления «Автор»: сначала удалите уже сохраненные отношения, а затем сохраните новые

0

Решение

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_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 ИЛИ использовать красноречивые методы (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
5

Другие решения

Для создания много:

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

Сначала удалите уже сохраненные отношения, затем сохраните новые

затем

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

По вопросам рекламы [email protected]