Laravel Eloquent ORM в банглі Part-8 (Копіювання моделей)
Laravel Eloquent-ом Копіювання моделей означає створення копії моделі, де всі дані основної моделі (або деякі конкретні поля) зберігаються як новий запис. Це зазвичай використовується, коли ви хочете створити напів-копію моделі, але не хочете вставляти ті самі дані знову.
В Laravel використовується метод replicate() для копіювання моделі. Нижче наведено приклад використання:
1. Копіювання моделі через метод replicate()
Використання:
Метод replicate()
створює копію моделі, але не копіює її ID і timestamps (якщо ви не зберігаєте їх). Ви також можете вибірково копіювати деякі конкретні поля.
use App\\Models\\Post;
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate(); // Копіюйте пост
// Якщо ви хочете змінити додаткові поля:
$newPost->title = 'Replicated Post';
$newPost->status = 'draft'; // Збережіть новий пост
$newPost->save();
Що відбувається?
- Метод
replicate()
копіює всі дані основної моделі і створює нову модель. - Ви можете встановити нові дані, наприклад
title
,status
тощо. - Нова копія зберігається у базі даних за допомогою методу
save()
.
2. Копіювання без деяких полів
Якщо ви хочете копіювати все, окрім деяких полів, то після методу replicate()
можна використовувати .except()
або .makeHidden()
.
use App\\Models\\Post;
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate()->makeHidden(['created_at', 'updated_at']); // Копіюйте всі поля, окрім `created_at` та `updated_at`
$newPost->save();
Таким чином, ви зможете копіювати всі дані, окрім зазначених полів, таких як created_at
та updated_at
.
3. Копіювання пов'язаних моделей
Коли модель має зв'язок з іншими моделями, як-от відносини один до багатьох (One-to-Many) або багато до багатьох (Many-to-Many), ви можете копіювати ці пов'язані моделі.
Наприклад, якщо пост має багато коментарів (comments):
use App\\Models\\Post;
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate(); // Копіюйте пост
$newPost->comments = $post->comments; // Копіюйте коментарі
$newPost->save();
Це копіює всі коментарі основного поста і додає їх до нового поста.
4. Копіювання відносин (Cascade Replication)
Якщо ви хочете, щоб всі пов'язані моделі також копModels\Post;
```
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate(); // Копіюйте пост
$newPost->save(); // Спочатку збережіть новий пост
// Копіюйте пов'язані коментарі
foreach ($post->comments as $comment) {
$newPost->comments()->create([
'content' => $comment->content,
'author_id' => $comment->author_id
]);
}
Це забезпечить, що всі коментарі основного поста також будуть скопійовані в новий пост.
5. Копіювання моделі з пропуском конкретних полів
Іноді вам може знадобитися скопіювати модель, пропустивши деякі конкретні поля. Наприклад, копіювати всі дані поста, окрім його id
:
use App\\Models\\Post;
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate(['id']); // Пропустіть `id` при копіюванні
$newPost->save();
Тут все, окрім id
, буде скопійовано, а новий пост отримає нове id
.
6.
replicate()
та валідація
Оскільки метод replicate()
створює копію основної моделі, при створенні нової копії можуть застосовуватись ті ж самі процеси валідації. Якщо у вашій моделі є валідація, то вона буде працювати і для нової моделі.
use App\\Models\\Post;
use Illuminate\\Support\\Facades\\Validator;
$post = Post::find(1); // Знайдіть основний пост
$newPost = $post->replicate();
$newPost->title = 'Replicated Post'; // Перевірте валідацію для нового поста
$validator = Validator::make($newPost->toArray(), [
'title' => 'required|unique:posts|max:255',
]);
if ($validator->fails()) {
// Помилка валідації
return redirect()->back()->withErrors($validator)->withInput();
}
$newPost->save();
Тут перевіряється валідація для нового поста, і якщо є помилка, вона буде відображена.
Перекладено з: Laravel Eloquent ORM in Bangla Part-8 (Replicating Models)