# ক্লাস নং-৮(বোনাস)। প্রজেক্ট-১
লারাভেল-কোর্সেস
backend data setup, database-design,database-relation
=============

# **ক্লাস নং-৮(বোনাস)।**

# **\=============**

**আজকের ক্লাসের মেইন টপিক হলো আমাদের আপকামিং প্রজেক্টের ডেটাবেজ ডিজাইন এবং ডেটাবেজের রিলেশন সম্পর্কে বিস্তারিত জানা।যদিও এটা অনেক complex**

**একটা টার্ম তারপরেও এটা কে ভয় না করে একটু সময় দিলে আশা করি খুব সহজেই আপনি বিষয়টি আপনার আয়ত্তে নিয়ে আসতে পারবেন।**  

**আজকে আমাদের ডেটাবেজ ডিজাইন করা হবে db design website এর মাধ্যমে খুব সুন্দর user interface আপনি সহজেই সেটি বুঝতে পারবেন এবং ব্যাবহার করতে পারবেন।**

**আগের আর্টিকেল এই বলেছিলাম ডেটাবেজ ডিজাইন আপনি যদি ভাল ভাবে বুঝতে চান।কাজ করতে চান তাহলে অবশ্যই আপনাকে ডেটা টাইপ সম্পর্কে ভাল ধারনা থাকা লাগবে।**

**তাহলেই কেবল আপনি।**

**id,name,email**

**বিভিন্ন টেবিলের বিভিন্ন কলাম এর প্রয়োজোনিয় ডেটা নিয়ে সুন্দর মত ডিজাইন করতে পারবেন।**

**এবং রিলেশন এর ক্ষেত্রে আপনাকে অবশ্যই ভাল ভাবে বুঝতে হবে আপনি কোন টেবিলের কোন কলামের সাথে রিলেশন করবেন এবং কেন করবেন।রিলেশন টা অবশ্যই আপনার মডেল এ হবে ।**

**এটার বিস্তারিত ডিজাইন আপনি ভিডিও থেকে দেখে নিতে পারবেন।**  

# **many to many relation overview**

# **\===============================**

**many to many relation এর ক্ষেত্রে মাঝখানে যে pivot table টা কাজ করে সেটা অবশ্যই দুইটা table এর সাথেই কানেক্ট হবে ইউনিক ভাবে।**

**মনে করুন আপনার কোর্স একটা table আছে।**  

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1671535040136/R18XtNZty.png align="center")

  

**এখানে 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-&gt;id();
> 
> $table-&gt;string('name',255);
> 
> $table-&gt;unsignedBigInteger('book')-&gt;default(0);
> 
> $table-&gt;unsignedBigInteger('year');
> 
> $table-&gt;float('price')-&gt;default(0.00);
> 
> $table-&gt;string('image',255)-&gt;nullable();
> 
> $table-&gt;text('content');
> 
> $table-&gt;text('link');
> 
> $table-&gt;unsignedBigInteger('submitted\_by')-&gt;nullable();
> 
> $table-&gt;unsignedBigInteger('duration');
> 
> $table-&gt;unsignedBigInteger('platform\_id')-&gt;nullable();
> 
> $table-&gt;foreign('submitted\_by')-&gt;references('id')-&gt;on('users')-&gt;onDelete('set null');
> 
> $table-&gt;foreign('platform\_id')-&gt;references('id')-&gt;on('platforms')-&gt;onDelete('set null');
> 
> $table-&gt;timestamps();
> 
> });

**এখানে একটা বিষয় মাথায় রাখতে হবে আপনি যে রিলেশন তৈরি করলেন সেখানে onDelete()function টা লিখে আপনি নাল অথবা casecade set করে দিতে পারেন।**

> $table-&gt;foreign('submitted\_by')-&gt;references('id')-&gt;on('users')-&gt;onDelete('set null');

> $table-&gt;foreign('platform\_id')-&gt;references('id')-&gt;on('platforms')-&gt;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-&gt;unsignedBigInteger('course\_id');**

**$table-&gt;unsignedBigInteger('topic\_id');**

**$table-&gt;unique(\['course\_id','topic\_id'\]);**

**$table-&gt;foreign('course\_id')-&gt;references('id')-&gt;on('courses')-&gt;onDelete('cascade');**

**$table-&gt;foreign('topic\_id')-&gt;references('id')-&gt;on('topics')-&gt;onDelete('cascade');**

**});**

  

  

# **//refference table course\_series for relation||pivot table**

**Schema::create('course\_series', function (Blueprint $table) {**

**$table-&gt;unsignedBigInteger('course\_id');**

**$table-&gt;unsignedBigInteger('series\_id');**

**$table-&gt;unique(\['series\_id','course\_id'\]);**  

**$table-&gt;foreign('course\_id')-&gt;references('id')-&gt;on('courses')-&gt;onDelete('cascade');**

**$table-&gt;foreign('series\_id')-&gt;references('id')-&gt;on('series')-&gt;onDelete('cascade');**

**});**

  

# **//refference table course\_author for relation||pivot table**

**Schema::create('course\_author', function (Blueprint $table) {**

**$table-&gt;unsignedBigInteger('course\_id');**

**$table-&gt;unsignedBigInteger('author\_id');**

**$table-&gt;unique(\['course\_id','author\_id'\]);**  

**$table-&gt;foreign('course\_id')-&gt;references('id')-&gt;on('courses')-&gt;onDelete('cascade');**

**$table-&gt;foreign('author\_id')-&gt;references('id')-&gt;on('authors')-&gt;onDelete('cascade');**

**});**

**$table-&gt;unique(\['series\_id','course\_id'\]);**

**database এর কোর্স আইডি এবং সিরিজ আইডি যেন duplicate না হয়ে যায় সেজন্য ইউনিক করে নেবেন।প্রত্যেকটার ক্ষেত্রে।**  

**এবার আপনার Database এর migration command run করবেন। database Table গুলো ভাল ভাবে হয়ে গেলে এবার আপনি আপনার project এর জন্য ফেক ডেটা জেনারেট করতে পারেন।**  

**প্রথমেই factory তে প্রয়োজন অনুযায়ী কোড করে নেবেন।**

  

**public function definition()**

**{**

**return \[**

**"name" =&gt;fake()-&gt;sentence,**

**"type" =&gt;rand(0,1),**

**"resources" =&gt;rand(1,50),**

**"price" =&gt;rand(0,1)? rand(1,100) : 0.00,**

**"year" =&gt;rand(2010,2021),**

**"image" =&gt;fake()-&gt;imageUrl(),**

**"description" =&gt;fake()-&gt;paragraph,**

**"link" =&gt;fake()-&gt;url(),**

**"submitted\_by" =&gt;User::all()-&gt;random()-&gt;id,**

**"duration" =&gt;rand(0,2),**

**"platform\_id" =&gt;Platform::all()-&gt;random()-&gt;id,**

**\];**

**}**

  

**এখানে একটু সতর্ক থাকবেন।বিভিন্ন রকম ফেক ডেটা এবং built in function গুলো সবটার ক্ষত্রে আপনার কাজ নাও করতে পারে চেক করে নেবেন।**  

**এরপর সীডার এর কাজ সিডারে প্রয়োজন অনুসারে আপনার কোড করবেন।যেমন আপনার কোন কোন ডেটা ফেক লাগবে এবং কোন কোন ডেটা original দিলেই হবে।**

**সাধারনত যখন আপনার অল্প কিছু ডেটা লাগবে তখন আপনি সেটা ম্যানুয়ালি দিতে পারবেন।**

যেমনঃ

**$topics = \['Eloquent','validation','Refactoring','Testing','Authentication'\];**

**foreach ($topics as $item) {**

**Topic::create(\[**

**'name' =&gt;$item,**

**\]);**

**}**

**আর fake data এর জন্য আপনি যেই যেই কলামে আপনার ডেটা লাগবে সেই সেই কলামে দিতে পারেন।**

**//create 50 users**

**User::factory(50)-&gt;create();**

  

**এখানে মডেল দিয়ে factory builtin function declare করে create করতে পারবেন।**  

**এবং ডেটা শো করানোর জন্য আপনি আপনার wep.php route এ গিয়ে রাউট তৈরি করে**

**controller এ function তৈরি করে সুন্দর মত ডেটা শো করাতে পারবেন।**

  

**এবং রিলেশন অনুযায়ী আপনি যদি ডেটা শো করাতে চান তাহলে আপনার মডেল এ রিলেশন তৈরি করবেন ।**

> public function platform(){
> 
> return $this-&gt;belongsTo(Platform::class);
> 
> }

  

**এবং controller এ গিয়ে ডেটা find করার সময় আপনার রিলেশন টা উল্লেখ করে দেবেন এবং return করবেন।**

> public function show($id){

> $course = Course::with('platform')-&gt;findorFail($id);

> // return '&lt;pre&gt;'.$course.'&lt;/pre&gt;' ;

> // return dd($course);

> return $course;

> }

  

**এটা গেল one to one relationship এর কাহিনি এবং একটা ডেটা নিয়ে আশা ।যদি ২-৩ টা ডেটা আপনি নিয়ে আসতে চান শো করাতে চান তাহলে আপনার রিলেশন এর মাধ্যমে সেটা নিয়ে আসতে হবে।**

# **এবার আসুন many to many relationship**

# **\=================================**

**topic এর সাথে course এর রিলেশন আপনার course model এ এই ফাংশন টি লিখতে পারেন .**

public function topics(){

  

> return $this-&gt;belongsToMany(Topic::class,'course\_topic','course\_id','topic\_id');

> }

  

> //for authours

> public function authors(){

> return $this-&gt;belongsToMany(Author::class,'course\_author','course\_id','author\_id');
> 
> }

  

  

**এবং database seeder এ আপনাকে একটা কন্ডিশন চালাতে হবে যেন একি id বার বার conflict না করে।**

  

> $courses = Course::all();

> foreach ($courses as $course) {

> $topics = Topic::all()-&gt;random(rand(1,5))-&gt;pluck('id')-&gt;toArray();

> $course-&gt;topics()-&gt;attach($topics);

> $authors = Author::all()-&gt;random(rand(1,3))-&gt;pluck('id')-&gt;toArray();

> $course-&gt;authors()-&gt;attach($authors);

> }

**ব্যাস এবার আপনি আবার migration seed চালানোর জন্য প্রস্তত।**

**আবার আপনাকে database seeder এ গিয়ে আপনার author সেট করা লাগবে যদি না আপনি আপনার author set না করে থাকেন।**

  

> //create author

> $authors = \["Rakibul Islam","Rasel","Laravel"\];
> 
> foreach ($authors as $item) {
> 
> Author::create(\[
> 
> 'name' =&gt;$item,
> 
> \]);
> 
> }

**এবং controller এ গিয়ে ডেটা find করার সময় আপনার রিলেশন টা উল্লেখ করে দেবেন এবং return করবেন।**

> public function show($id){

> $course = Course::with('platform','topics')-&gt;findorFail($id);

> // return '&lt;pre&gt;'.$course.'&lt;/pre&gt;' ;

> // return dd($course);

> return $course;

> }
> 
>   

**এবার আপনার ব্রাউজার এ নির্দিষ্ট id দিয়ে আপনি আপনার ডেটা গুলো শো করাতে পারবেন।**

**আশা করি বুঝতে পেরেছেন।অনেক ঝামেলা লাগবে এটা শিউর ।আর আপনাদের এই ঝামেলা মুক্ত করার জন্য আমার এই চেষ্টা।**

**ধন্যবাদ।**

## **\_\_\_RAKIBUL ISLAM\_\_\_**
