Метод replicate
Метод replicate применяется к существующей модели Eloquent
и возвращает новый экземпляр модели с теми же атрибутами,
кроме полей id и полей с временными метками
created_at и updated_at. По умолчанию метод
не копирует связи модели, а также не сохраняет новую
копию автоматически. Он подготавливает новую модель
для последующего сохранения.
Метод принимает необязательный параметр - массив атрибутов, которые нужно исключить из копирования. Это полезно, когда необходимо создать копию записи с небольшими изменениями.
Синтаксис
<?php
$newModel = $existingModel->replicate($excludeAttributes);
$newModel->save();
?>
Пример
Давайте создадим копию статьи с id равным 1
и сохраним её в базу данных:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function replicateArticle()
{
$article = Article::find(1);
$newArticle = $article->replicate();
$newArticle->save();
echo "New article ID: " . $newArticle->id;
}
}
?>
Результат выполнения кода:
"New article ID: 2"
В результате будет создана новая запись с теми же
полями, что и у исходной статьи, но с новым
автоматически сгенерированным id.
Пример
Давайте создадим копию статьи, но исключим из копирования
поле slug и поле title, чтобы задать им
новые значения:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function replicateWithExclude()
{
$article = Article::find(1);
$newArticle = $article->replicate(['slug', 'title']);
$newArticle->title = 'New Article Title';
$newArticle->slug = 'new-article-slug';
$newArticle->save();
echo $newArticle->title;
}
}
?>
Результат выполнения кода:
"New Article Title"
Пример
Давайте скопируем статью вместе с её комментариями, используя связи:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function replicateWithRelations()
{
$article = Article::with('comments')->find(1);
$newArticle = $article->replicate();
$newArticle->save();
foreach ($article->comments as $comment) {
$newComment = $comment->replicate();
$newComment->article_id = $newArticle->id;
$newComment->save();
}
echo "Copied " . $article->comments->count() . " comments";
}
}
?>
Результат выполнения кода:
"Copied 5 comments"