DEV Community

Cover image for Laravel Eloquent ORM in Bangla Part-8 (Replicating Models)
Sontus Chandra Anik
Sontus Chandra Anik

Posted on

Laravel Eloquent ORM in Bangla Part-8 (Replicating Models)

Laravel Eloquent-এ Replicating Models হচ্ছে একটি মডেলের কপি তৈরি করা, যাতে মূল মডেলের সমস্ত ডেটা (বা কিছু নির্দিষ্ট ক্ষেত্র) নতুন রেকর্ড হিসেবে সংরক্ষিত হয়। এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি একটি মডেলের সেমি-কপি তৈরি করতে চান, কিন্তু একই ডেটা পুনরায় ইনসার্ট করতে চান না।

Laravel-এ replicate() মেথড ব্যবহার করে মডেল রিপ্লিকেট করা হয়। নিচে এর ব্যবহার দেখানো হলো:

১. replicate() মেথড দিয়ে মডেল রিপ্লিকেট করা

ব্যবহার:

replicate() মেথড মডেলের একটি কপি তৈরি করে, তবে এটি মডেলটির আইডি এবং timestamps (যদি আপনি এগুলো সংরক্ষণ না করেন) কপি করবে না। আপনি চাইলে কিছু নির্দিষ্ট ফিল্ডও রিপ্লিকেট করতে পারবেন।

use App\Models\Post;

$post = Post::find(1);  // মূল পোস্টটি খুঁজে নিন

// পোস্টটি রিপ্লিকেট করুন
$newPost = $post->replicate();

// কিছু অতিরিক্ত ফিল্ড পরিবর্তন করতে চাইলে:
$newPost->title = 'Replicated Post';
$newPost->status = 'draft';

// নতুন পোস্ট সেভ করুন
$newPost->save();

Enter fullscreen mode Exit fullscreen mode

কী ঘটছে?

  1. replicate() মেথডটি মূল মডেলটির সমস্ত ডেটা কপি করে নতুন মডেল তৈরি করে।
  2. আপনি চাইলে নতুন ডেটা সেট করতে পারেন, যেমন title, status ইত্যাদি।
  3. নতুন কপি save() মেথড দিয়ে ডাটাবেসে সংরক্ষিত হয়।

২. কিছু ফিল্ড ছাড়া রিপ্লিকেট করা

যদি আপনি চান যে কিছু নির্দিষ্ট ফিল্ড বাদে অন্য সব কিছু রিপ্লিকেট করা হোক, তাহলে replicate() মেথডের পর .except() অথবা .makeHidden() ব্যবহার করতে পারেন।

use App\Models\Post;

$post = Post::find(1); // মূল পোস্টটি খুঁজে নিন

// `created_at` এবং `updated_at` বাদে বাকি সব ফিল্ড রিপ্লিকেট করুন
$newPost = $post->replicate()->makeHidden(['created_at', 'updated_at']);

// নতুন পোস্ট সেভ করুন
$newPost->save();

Enter fullscreen mode Exit fullscreen mode

এভাবে আপনি created_at এবং updated_at টাইমস্ট্যাম্পগুলো বাদ দিয়ে অন্য সব ডেটা কপি করতে পারবেন।

৩. সম্পর্কযুক্ত মডেল রিপ্লিকেট করা

যখন একটি মডেল অন্য মডেলগুলির সাথে সম্পর্কিত থাকে, যেমন একে অনেক (One-to-Many) বা অনেকে অনেক (Many-to-Many) সম্পর্ক, তখন আপনি সেই সম্পর্কিত মডেলগুলোও কপি করতে পারবেন।

যেমন, একটি পোস্টের সাথে অনেক মন্তব্য (comments) সম্পর্কিত হলে:

use App\Models\Post;

$post = Post::find(1);  // মূল পোস্টটি খুঁজে নিন

// পোস্ট রিপ্লিকেট করুন
$newPost = $post->replicate();

// সম্পর্কিত মন্তব্যগুলোও কপি করুন
$newPost->comments = $post->comments;  // মন্তব্যগুলি কপি করা

// নতুন পোস্ট সেভ করুন
$newPost->save();

Enter fullscreen mode Exit fullscreen mode

এটি মূল পোস্টের সব মন্তব্য কপি করে নতুন পোস্টে যুক্ত করবে।


৪. রিলেশনশিপের কপি তৈরি করা (Cascade Replication)

যদি আপনি চান যে, আপনার মডেলের সম্পর্কিত সকল মডেলও একইভাবে রিপ্লিকেট হোক, তখন আপনাকে সেই সম্পর্কের জন্য বিশেষভাবে রিপ্লিকেট করতে হবে। উদাহরণস্বরূপ:

use App\Models\Post;

$post = Post::find(1);  // মূল পোস্টটি খুঁজে নিন

// পোস্টটি রিপ্লিকেট করুন
$newPost = $post->replicate();

// সম্পর্কিত মন্তব্য কপি করুন (Cascade Replication)
$newPost->save(); // নতুন পোস্টটি প্রথমে সেভ করুন

// সম্পর্কিত মন্তব্য কপি করুন
foreach ($post->comments as $comment) {
    $newPost->comments()->create([
        'content' => $comment->content,
        'author_id' => $comment->author_id
    ]);
}

Enter fullscreen mode Exit fullscreen mode

এটি নিশ্চিত করবে যে মূল পোস্টের মন্তব্যও নতুন পোস্টের সাথে কপি হবে।

৫. কোনো নির্দিষ্ট ফিল্ড বাদ দিয়ে রিপ্লিকেট করা

কখনও কখনও আপনি চাইবেন কিছু নির্দিষ্ট ফিল্ড বাদ দিয়ে মডেল রিপ্লিকেট করতে। যেমন, পোস্টের id বাদ দিয়ে অন্য সব ডেটা কপি করতে:

use App\Models\Post;

$post = Post::find(1);

// `id` বাদে বাকি সব ফিল্ড রিপ্লিকেট করুন
$newPost = $post->replicate(['id']);

// নতুন পোস্ট সেভ করুন
$newPost->save();

Enter fullscreen mode Exit fullscreen mode

এখানে id বাদে অন্য সমস্ত ফিল্ড কপি হবে, এবং নতুন পোস্টে id তৈরি হবে।

৬. replicate() এবং Validation

যেহেতু 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();

Enter fullscreen mode Exit fullscreen mode

এখানে নতুন পোস্টের জন্য ভ্যালিডেশন চেক করা হয়েছে এবং যদি কোনো ত্রুটি থাকে, তবে সেটি প্রদর্শন করা হবে।

Top comments (0)