ক্লাস নং-৮(বোনাস)। প্রজেক্ট-১ লারাভেল-কোর্সেস backend data setup, database-design,database-relation =============
Table of contents
- ক্লাস নং-৮(বোনাস)।
- \=============
- many to many relation overview
- \===============================
- pivot table relation
- \====================
- //refference table course_topic for relation||pivot table
- //refference table course_series for relation||pivot table
- //refference table course_author for relation||pivot table
- এবার আসুন many to many relationship
- \=================================
ক্লাস নং-৮(বোনাস)।
\=============
আজকের ক্লাসের মেইন টপিক হলো আমাদের আপকামিং প্রজেক্টের ডেটাবেজ ডিজাইন এবং ডেটাবেজের রিলেশন সম্পর্কে বিস্তারিত জানা।যদিও এটা অনেক complex
একটা টার্ম তারপরেও এটা কে ভয় না করে একটু সময় দিলে আশা করি খুব সহজেই আপনি বিষয়টি আপনার আয়ত্তে নিয়ে আসতে পারবেন।
আজকে আমাদের ডেটাবেজ ডিজাইন করা হবে db design website এর মাধ্যমে খুব সুন্দর user interface আপনি সহজেই সেটি বুঝতে পারবেন এবং ব্যাবহার করতে পারবেন।
আগের আর্টিকেল এই বলেছিলাম ডেটাবেজ ডিজাইন আপনি যদি ভাল ভাবে বুঝতে চান।কাজ করতে চান তাহলে অবশ্যই আপনাকে ডেটা টাইপ সম্পর্কে ভাল ধারনা থাকা লাগবে।
তাহলেই কেবল আপনি।
id,name,email
বিভিন্ন টেবিলের বিভিন্ন কলাম এর প্রয়োজোনিয় ডেটা নিয়ে সুন্দর মত ডিজাইন করতে পারবেন।
এবং রিলেশন এর ক্ষেত্রে আপনাকে অবশ্যই ভাল ভাবে বুঝতে হবে আপনি কোন টেবিলের কোন কলামের সাথে রিলেশন করবেন এবং কেন করবেন।রিলেশন টা অবশ্যই আপনার মডেল এ হবে ।
এটার বিস্তারিত ডিজাইন আপনি ভিডিও থেকে দেখে নিতে পারবেন।
many to many relation overview
\===============================
many to many relation এর ক্ষেত্রে মাঝখানে যে pivot table টা কাজ করে সেটা অবশ্যই দুইটা table এর সাথেই কানেক্ট হবে ইউনিক ভাবে।
মনে করুন আপনার কোর্স একটা table আছে।
এখানে course table এর id এর সাথে course_series এর course_id এর সাথে সম্পর্ক ।এবং course_series এর series_id এর সাথে
Series table এর id এর সাথে সম্পর্ক। তাহলে এখানে course_series table টা দুইটা টেবিল এর মধ্যে সম্পর্ক তৈরির কাজ করছে।যেটাকে পিভট টেবিল বলা হচ্ছে।
এভাবে আপনি many to many relation গুলো খুব সহজেই তৈরি করতে পারবেন।
এবার আপনি আপনার যে ডেটাবেজ ডিজাইন করলেন সেটা দেখে আপনি আপনার মাইগ্রেশন এ টেবিল অনুযায়ী কোড লিখে ফেলবেন ।এবং রিলেশন তৈরি করবেন।
Schema::create('courses', function (Blueprint $table) {
$table->id();
$table->string('name',255);
$table->unsignedBigInteger('book')->default(0);
$table->unsignedBigInteger('year');
$table->float('price')->default(0.00);
$table->string('image',255)->nullable();
$table->text('content');
$table->text('link');
$table->unsignedBigInteger('submitted_by')->nullable();
$table->unsignedBigInteger('duration');
$table->unsignedBigInteger('platform_id')->nullable();
$table->foreign('submitted_by')->references('id')->on('users')->onDelete('set null');
$table->foreign('platform_id')->references('id')->on('platforms')->onDelete('set null');
$table->timestamps();
});
এখানে একটা বিষয় মাথায় রাখতে হবে আপনি যে রিলেশন তৈরি করলেন সেখানে onDelete()function টা লিখে আপনি নাল অথবা casecade set করে দিতে পারেন।
$table->foreign('submitted_by')->references('id')->on('users')->onDelete('set null');
$table->foreign('platform_id')->references('id')->on('platforms')->onDelete('set null');
এটা দেবার কারন হলো অনেক সময় আপনার ইউজার ডিলেট করা লাগতে পারে কিন্তু আপনার ইউজার এর প্রয়োজনীয় কন্টেন্ট আপনি রাখতে চাচ্ছেন সেক্ষেত্রে আপনি 'set null'
করে দেবেন।তাহলে এটার author show করবে না।আর যদি content delete করতে চান সেক্ষত্রে আপনি casecade দিতে পারেন।
pivot table relation
\====================
//refference table course_topic for relation||pivot table
Schema::create('course_topic', function (Blueprint $table) {
$table->unsignedBigInteger('course_id');
$table->unsignedBigInteger('topic_id');
$table->unique(['course_id','topic_id']);
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
$table->foreign('topic_id')->references('id')->on('topics')->onDelete('cascade');
});
//refference table course_series for relation||pivot table
Schema::create('course_series', function (Blueprint $table) {
$table->unsignedBigInteger('course_id');
$table->unsignedBigInteger('series_id');
$table->unique(['series_id','course_id']);
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
$table->foreign('series_id')->references('id')->on('series')->onDelete('cascade');
});
//refference table course_author for relation||pivot table
Schema::create('course_author', function (Blueprint $table) {
$table->unsignedBigInteger('course_id');
$table->unsignedBigInteger('author_id');
$table->unique(['course_id','author_id']);
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
$table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
});
$table->unique(['series_id','course_id']);
database এর কোর্স আইডি এবং সিরিজ আইডি যেন duplicate না হয়ে যায় সেজন্য ইউনিক করে নেবেন।প্রত্যেকটার ক্ষেত্রে।
এবার আপনার Database এর migration command run করবেন। database Table গুলো ভাল ভাবে হয়ে গেলে এবার আপনি আপনার project এর জন্য ফেক ডেটা জেনারেট করতে পারেন।
প্রথমেই factory তে প্রয়োজন অনুযায়ী কোড করে নেবেন।
public function definition()
{
return [
"name" =>fake()->sentence,
"type" =>rand(0,1),
"resources" =>rand(1,50),
"price" =>rand(0,1)? rand(1,100) : 0.00,
"year" =>rand(2010,2021),
"image" =>fake()->imageUrl(),
"description" =>fake()->paragraph,
"link" =>fake()->url(),
"submitted_by" =>User::all()->random()->id,
"duration" =>rand(0,2),
"platform_id" =>Platform::all()->random()->id,
];
}
এখানে একটু সতর্ক থাকবেন।বিভিন্ন রকম ফেক ডেটা এবং built in function গুলো সবটার ক্ষত্রে আপনার কাজ নাও করতে পারে চেক করে নেবেন।
এরপর সীডার এর কাজ সিডারে প্রয়োজন অনুসারে আপনার কোড করবেন।যেমন আপনার কোন কোন ডেটা ফেক লাগবে এবং কোন কোন ডেটা original দিলেই হবে।
সাধারনত যখন আপনার অল্প কিছু ডেটা লাগবে তখন আপনি সেটা ম্যানুয়ালি দিতে পারবেন।
যেমনঃ
$topics = ['Eloquent','validation','Refactoring','Testing','Authentication'];
foreach ($topics as $item) {
Topic::create([
'name' =>$item,
]);
}
আর fake data এর জন্য আপনি যেই যেই কলামে আপনার ডেটা লাগবে সেই সেই কলামে দিতে পারেন।
//create 50 users
User::factory(50)->create();
এখানে মডেল দিয়ে factory builtin function declare করে create করতে পারবেন।
এবং ডেটা শো করানোর জন্য আপনি আপনার wep.php route এ গিয়ে রাউট তৈরি করে
controller এ function তৈরি করে সুন্দর মত ডেটা শো করাতে পারবেন।
এবং রিলেশন অনুযায়ী আপনি যদি ডেটা শো করাতে চান তাহলে আপনার মডেল এ রিলেশন তৈরি করবেন ।
public function platform(){
return $this->belongsTo(Platform::class);
}
এবং controller এ গিয়ে ডেটা find করার সময় আপনার রিলেশন টা উল্লেখ করে দেবেন এবং return করবেন।
public function show($id){
$course = Course::with('platform')->findorFail($id);
// return '<pre>'.$course.'</pre>' ;
// return dd($course);
return $course;
}
এটা গেল one to one relationship এর কাহিনি এবং একটা ডেটা নিয়ে আশা ।যদি ২-৩ টা ডেটা আপনি নিয়ে আসতে চান শো করাতে চান তাহলে আপনার রিলেশন এর মাধ্যমে সেটা নিয়ে আসতে হবে।
এবার আসুন many to many relationship
\=================================
topic এর সাথে course এর রিলেশন আপনার course model এ এই ফাংশন টি লিখতে পারেন .
public function topics(){
return $this->belongsToMany(Topic::class,'course_topic','course_id','topic_id');
}
//for authours
public function authors(){
return $this->belongsToMany(Author::class,'course_author','course_id','author_id');
}
এবং database seeder এ আপনাকে একটা কন্ডিশন চালাতে হবে যেন একি id বার বার conflict না করে।
$courses = Course::all();
foreach ($courses as $course) {
$topics = Topic::all()->random(rand(1,5))->pluck('id')->toArray();
$course->topics()->attach($topics);
$authors = Author::all()->random(rand(1,3))->pluck('id')->toArray();
$course->authors()->attach($authors);
}
ব্যাস এবার আপনি আবার migration seed চালানোর জন্য প্রস্তত।
আবার আপনাকে database seeder এ গিয়ে আপনার author সেট করা লাগবে যদি না আপনি আপনার author set না করে থাকেন।
//create author
$authors = ["Rakibul Islam","Rasel","Laravel"];
foreach ($authors as $item) {
Author::create([
'name' =>$item,
]);
}
এবং controller এ গিয়ে ডেটা find করার সময় আপনার রিলেশন টা উল্লেখ করে দেবেন এবং return করবেন।
public function show($id){
$course = Course::with('platform','topics')->findorFail($id);
// return '<pre>'.$course.'</pre>' ;
// return dd($course);
return $course;
}
এবার আপনার ব্রাউজার এ নির্দিষ্ট id দিয়ে আপনি আপনার ডেটা গুলো শো করাতে পারবেন।
আশা করি বুঝতে পেরেছেন।অনেক ঝামেলা লাগবে এটা শিউর ।আর আপনাদের এই ঝামেলা মুক্ত করার জন্য আমার এই চেষ্টা।
ধন্যবাদ।