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)