বাংলায় PHP LARAVEL FRAMEWORK পর্ব-১৬ : Insert, Update and Delete with Eloquent ORM Model

Insert, Update and Delete with Laravel Eloquent ORM Model

Laravel ১৬ তম পর্বে আপনাকে স্বাগতম। এই পর্বটি বুঝতে হলে আপনাকে প্রথমে Eloquent ORM Model এর উপর আমাদের ১৫তম article টি পড়ে আসতে হবে। ১৫ তম পর্বে আমরা Eloquent ORM Model কি? এবং কিভাবে কাজ করে , সেই বিষয় গুলো জেনেছি এই পর্বে আমরা শিখব, কিভাবে Eloquent ORM Model ব্যবহার করে Database এ Data Insert, Update এবং Delete এর কাজগুলো করা যায়।

Insert

Laravel Framework এর Eloquent ORM Model ব্যবহার করে ডাটাবেসের মধ্যে একটি নতুন রেকর্ড তৈরি করতে চাইলে আপনাকে আপনার Model এর একটি নতুন object তৈরী করতে হবে , এবং মডেলের Property গুলো সেট করতে হবে , তারপর save method টি ব্যবহার করতে হবে। তাহলে চলুন data insert করার জন্য প্রথমে web.php file এ আমরা একটা route declare করে ফেলি , আর এর জন্য route এ আমরা আমাদের studentController Class এর create method টি ব্যবহার করব। নিচের উদাহরণটি দেখুন :

Route::get('/create', 'StudentController@create');

এবার studentController Class এর create method এ নিচের কোডটি লিখুন:

public function create()
   {
       //
 
       $student = new Student;
 
       $student->name ="Sahab Uddin";
       $student->email="sa@gmail.com";
       $student->mobile="013452919848";
       $student->status=1;
       $student->created_at=now();
       $student->updated_at=now();
 
       echo $student->save()?"Insert Success":"Insert Fail";
    
   }

এখন আপনি যদি আপনার ব্রাউজার এ http://localhost:8000/createহিট করেন তাহলে নিচের মত ফলাফল দেখাবে :

Insert Data using Laravel 5.5

তবে আপনি যেকোনো form বা URL থেকে data receive করে database এ insert করতে চান , তাহলে আপনাকে StudentController class এর store method টি ব্যবহার করতে হবে। নিচের উদাহরণটি দেখুন :

public function store(Request $request)
    {
        //
 
        $student = new Student;
 
        $student->name =$request->name;
        $student->email=$request->email;
        $student->mobile=$request->mobile;
        $student->status=$request->status;
        $student->created_at=now();
        $student->updated_at=now();
 
        echo $student->save()?"Insert Success":"Insert Fail";
 
    }

Update

Laravel Framework এর Eloquent ORM Model ব্যবহার করে ডাটাবেসের মধ্যে কোনো রেকর্ড update করতে চাইলে আপনাকে Student::find() Method দিয়ে search করে একটি object তৈরী করতে হবে , এবং Student Model এর Property গুলো সেট করতে হবে , তারপর save method টি ব্যবহার করতে হবে। তাহলে চলুন data Update করার জন্য প্রথমে web.php file এ আমরা একটা route declare করে ফেলি , আর এর জন্য route এ আমরা আমাদের studentController Class এর update method টি ব্যবহার করব। নিচের উদাহরণটি দেখুন :

Route::get('/update', 'StudentController@update');

এবার studentController Class এর update method এ নিচের কোডটি লিখুন:

public function update(Request $request, Student $student)
  {
       
      //
      $student=Student::find(1);
      $student->name="Rashed Alam";
      $student->email="rashed@mail.com";
      $student->mobile="01799330022";
      echo $student->save()?"Update Success":"Update Fail";
  }

এখন আপনি যদি আপনার ব্রাউজার এ http://localhost:8000/update হিট করেন তাহলে নিচের মত ফলাফল দেখাবে :

Update with Laravel Eloquent ORM Model

Mass Updates

Laravel Eloquent ORM Model ব্যবহার করে একটা নির্দিষ্ট query ব্যবহার করে একাধিক row update করার পদ্ধতিকে বলা হয় Mass Update, দরুন আমরা Student Management Database এ যেইসব student “active” এবং যাদের subject হচ্ছে “English” , তাহলে তাদের exam টা delay করে দিবো , সেটার জন্য আপনার কোডটি নিচের মত হবে।

Student::where('active', 1)
          ->where('subject', 'English')
          ->update(['delayed' => 1]);

Mass Assignment Vulnerability

Form ব্যবহার করে কেও যেন SQL Injection এর মতো কাজ গুলো যেন করতে না পারে , সেই জন্য Laravel Framework এ Mass-Assignment Vulnerability feature এর ব্যবস্থা করা হয়েছে। ব্যাপারটা আরেকটু সহজ ভাবে বুঝা যাক, ধরুন আমাদের student database এ কোনো একজন student registration form সাবমিট করার পর পরই active হবেনা , এর জন্য admin ঐ student এর সব কিছু যাচাই বাছাই করে তারপর active করবে। কিন্তু কোনও চালাক student student form সাবমিট করার সময় ইন্সপেক্ট এলিমেন্ট করে পোস্ট রিকুয়েস্ট এর সাথে status=1 পাঠিয়ে দিলো আর সেজন্য সাথে সাথেই student টি active হয়ে যাবে। অথবা ধরুন আপনার ecommerce site এ কোনো চালাক buyer final submit এর সময় ইন্সপেক্ট এলিমেন্ট করে করে total_price এর value 3000 dollar এর পরিবর্তে মাত্র 30 dollar করে দিলো, আর এই ধরণের কাজ গুলোকে বলা হয় Mass-Assignment Vulnerability . আর এই দুর্বলতা গুলোকে কাটাতে Laravel Eloquent Model দুটি প্রপার্টি দিয়েছেঃ একটি fillable এবং আরেকটি guarded. আপনার application form এর কোন কোন input এর value পাঠানো যাবে তা fillable property দিয়ে whitelist এ রাখা হয় , আর কোন কোন property পাঠানো বেনা তা guarded দিয়ে blacklist এ রাখা হয়। নিচের উদাহরণটি দেখুন :

class Student extends Model
{
    protected $guarded = ['status'];
    protected $fillable = ['name','email','mobile'];
}

Other Creation Methods

firstOrCreate/ firstOrNew

mass assigning attributes এ Model তৈরী করার জন্য আপনি আরো দুইটি Method ব্যবহার করতে পারেন:

firstOrCreate: এটি প্রথমে আপনার database এ আপনার দেওয়া column/value এর ভিত্তিতে search করবে , যদি পায় তাহলে সেটি show করবে , আর না পেলে নতুন record তৈরী করবে।

firstOrNew: এটি firstOrCreate এর মতোই , পার্থক্য হচ্ছে এটি সরাসরি create করবেনা, আপনাকে আলাদা ভাবে save method call করতে হবে।

নিচের উদাহরণটি দেখুন :

// Retrieve Student by name, or create it if it doesn't exist...
$student = Student::firstOrCreate(['name' => 'Robin']);
 
// Retrieve Student by name, or create it with the name and active attributes...
$student= Student::firstOrCreate(
    ['name' => 'Robin, ['active' => 1]
);
 
// Retrieve by name, or instantiate...
$student= Student::firstOrNew(['name' => 'Robin']);
 
// Retrieve by name, or instantiate with the name and delayed attributes...
$student= Student::firstOrNew(
    ['name' => 'Robin'], ['status' => 1]
);

updateOrCreate

এটি প্রথমে আপনার database এ আপনার দেওয়া column/value এর ভিত্তিতে search করবে , যদি পায় তাহলে সেটি Update করবে , আর না পেলে নতুন record তৈরী করবে। নিচের উদাহরণটি দেখুন :

// Retrieve Student by name, or update it with the name and active attributes...
$student= Student::updateOrCreate(
    ['name' => 'Robin, ['active' => 1]
);

Delete

Laravel Framework এর Eloquent ORM Model ব্যবহার করে ডাটাবেসের মধ্যে কোনো রেকর্ড Delete করতে চাইলে আপনাকে Student::find() Method দিয়ে search করে একটি object তৈরী করতে হবে , এবং Student Model এর Property গুলো সেট করতে হবে , তারপর delete method টি ব্যবহার করতে হবে। তাহলে চলুন data Update করার জন্য প্রথমে web.php file এ আমরা একটা route declare করে ফেলি , আর এর জন্য route এ আমরা আমাদের studentController Class এর destroy method টি ব্যবহার করব। তাহলে চলুন data delete করার জন্য প্রথমে web.php file এ আমরা একটা route declare করে ফেলি , আর এর জন্য route এ আমরা আমাদের studentController Class এর destroy method টি ব্যবহার করব। নিচের উদাহরণটি দেখুন :

Route::get('/delete', 'StudentController@destroy');

এবার studentController Class এর destroy method এ নিচের কোডটি লিখুন:

public function destroy(Student $student)
    {
        //
        $student=Student::find(1);
        echo $student->delete()?"Delete Success":"Delete Fail!";
    }

এখন আপনি যদি আপনার ব্রাউজার এ http://localhost:8000/delete হিট করেন তাহলে নিচের মত ফলাফল দেখাবে :

Delete with Laravel Eloquent ORM Model

তবে আপনি চাইলে destroy() method ব্যবহার একসাথে একাধিক row delete করতে পারেন। নিচের উদাহরণটি দেখুন :

Student::destroy(1,2,3);
Student::destroy([1,2,3]);
Student::destroy(1);

এছাড়া একটা condition উপর ভিত্তি করে আপনি একাধিক row একসাথে delete করতে পারেন। নিচের উদাহরণটি দেখুন :

$deletedRows = Student::where('status', 0)->delete();