Laravel Eloquent ORM українською Частина-8 (Копіювання моделей)

pic

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();

Що відбувається?

  1. Метод replicate() копіює всі дані основної моделі і створює нову модель.
  2. Ви можете встановити нові дані, наприклад title, status тощо.
  3. Нова копія зберігається у базі даних за допомогою методу 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)

Leave a Reply

Your email address will not be published. Required fields are marked *