# ক্লাস নং-৮,ক্লাসের বিষয়-ডেটাবেজ রিলেশন,লারাভেল ফ্যাক্টরি,ডেটাবেজ সিডিং।

> অবশ্যই আজকের টপিক টা অনেক গুরুত্বপূর্ন একটা টপিক,এবং সেই সাথে বুঝতেো বেশ সময় লাগতে পারে আজকের ক্লাস টা।কারন আস্তে,ক্লাস গুলো একটু ইন্টারমিডিয়েট লেভেল এর দিকে যাচ্ছে।

  

**\==&gt;ডেটাবেইজ এর ও language আছে ।**

**\=&gt;sql(Structure Query Language )-&gt;আমরা যেটা ব্যাবহার করব।**

**এটা আবার ৪ ধরনের কুয়েরি হয়।**

> **\=&gt;TCL (Transaction Control Language)**

> **\=&gt;DML (Data Manipulation Language)**

> **\=&gt;DCL (Data Control Language)**

> **\=&gt;DDL (Data Definition Language)**

  

  

## **DATABASE এর MIGRATION আমরা DDL এর যে কমান্ড গুলো চালায় সেগুলো হলোঃ**

  

*   **CREATE DDL Command**
    
*   **ALTER DDL Command**
    
*   **DROP DDL Command**
    
*   **TRUNCATE DDL Command**
    
*   **RENAME DDL Command**
    

  

## **DATABASE এর MIGRATION আমরা DML এর যে কমান্ড গুলো চালায় সেগুলো হলোঃ**

  

*   **SELECT DML Command**
    
*   **INSERT DML Command**
    
*   **UPDATE DML Command**
    
*   **DELETE DML Command**
    

  

  

**এবং আর যে দুই টাইপ কুয়েরি আছে সেগুলো একটু কম ই ব্যাবহত হয়ে থাকে।**

  

## **\=&gt;DCL =&gt;মূলত বিভিন্ন পারমিশন এর ক্ষেত্রে ব্যাবহত হয়।কন্ট্রোল টাইপ।**

*   **Grant DCL Command**
    
*   **Revoke DCL Command**
    

  

  

## **\=&gt;TCL**

*   **Commit TCL Command**
    
*   **Rollback TCL Command**
    

  

> **ডেটাবেজ এর ক্ষেত্রে স্কিমা অনেক গুরুত্বপূর্ন ।স্কিমা বলতে সাধারনত বোঝায় কিভাবে ডেটাবেজ এর বিভিন্ন ফিল্ড এবং ডেটাবেজ এর টেবিল গুলো সাজানো আছে।**

## **ডেটাবেজ মাইগ্রেশন এর ডিফল্ট যে ফিল্ড গুলো থাকে।**

**$table-&gt;timestamp();**

**এটা মূলত ব্যাবহত হয় সময় এর জন্য কোন সময় অপারেশন টা হয়েছে।created\_at,updated\_at.**

  

  

**এবার আশা যাক বেশ কিছু ডেটাটাইপ এ যেগুলো আমরা ব্যাবহার করে থাকি ডেটাবেজ মাইগ্রেশন এর ক্ষেত্রে।এবং বিভিন্ন programming language এ।**

## **\=&gt;STRING**

## **সাধারনত ছোটখাট কেইস গুলোতে STRING DATATYPE ব্যাবহার করা হয়।যেমন অল্প কিছূ লেটার লেখা লাগবে।**

> **যেমনঃ-"আমার নাম রাকিব"**

## **\=&gt;INTEGER**

**পুর্ন সংখার ডেটা টাইপ হলো integer.**

**যেমনঃ-1,2,3,4,5**

## **\=&gt;FLOAT**

**ভগ্নাংশ সংখা গুলোর ক্ষেত্রে float type**

**যেমনঃ- ২.৩,৫.৪।**

## **\=&gt;VARCHAR**

**এই ডেটা টাইপ টাও নামের ক্ষেত্রে বেশ ব্যাবহার করা হয়ে থাকে।**

**\=&gt;char**

**\=&gt;text**

**\=&gt;LONGTEXT**

**etc**

  

**এই প্রত্যেক টা ডেটা টাইপ এর আবার লিমিট আছে যে কত সংখা,কত ক্যারাক্টার ব্যাবহার করবে।**

**CHAR(২৫৫)**

**VARCHAR( ২৫৫)**

**TEXT(65,535 bytes)**

**LONGTEXT(4,294,967,295 characters)**

  

**এখানে একটা প্রশ্ন থাকে যে ,string,char,varchar,text,longtext, সব ই তো string এর মত কাজ করে তাহলে কেন আমরা শুধু string,varchar,char**

**ব্যাবহার করে থাকি।**

  

> **উত্তরঃ-আমরা বিভিন্ন ডেটা টাইপ এর সাইজ দেখেই বুঝে গেছি হয়ত।কারন আমরা স্ট্রিং ব্যাবহার করে থাকি অল্প কিছু ক্যারাক্টার আমাদের নামের ক্ষেত্রে ব্যাবহার করা হয়।**

> **এক্ষেত্রে আমাদের মেমোরি অল্প লাগতেছে কিন্তু অন্যান্য ডেটা টাইপ গুলোর সাইজ বেশ বড় ।application এর সাইজ পরবর্তিতে বড় হয়ে যাবে এবং performance কম হবে।যার কারনে**

> **string,char,varchar ব্যাবহার করা হয়।**

  

> **\==&gt;হারুন ভাই আরেকটা কথা বলেছেন যে indexing করতে গেলে,Text,longtext এ অনেক ঝামেলা পোহাতে হয়।যার কারনে string,char,varchar ব্যাবহার করা হয়।**

  

**database migration এ দুইটা ফাংশন কাজ করে ।**

> **১।**

> **public function up(){**
> 
> **//এখানে আমরা আমাদের ডেটাবেজ এর বিভিন্ন কলাম তৈরি করি।**
> 
> **}**

**২।**

> **public function down(){**
> 
> **//এখানে আমরা আমাদের ডেটাবেজ এর বিভিন্ন কলাম প্রয়োজন অনুসারে ডিলিট করি/ড্রপ করি।**
> 
> **}**

  

  

> **down function এ দারুন একটা কেইস আছে সেটা হল আপনি যদি আপনার কোন কলাম ড্রপ করেন পরবর্তিতে ।আবার যদি রান করেন migration তাহলে তখন আপনার up function**

> **run হবে কিন্তু ডাউন ফাংশন রান হবে না। আবার যদি migrate করেন তখন আবার down function run হবে।**

## **এক্ষেত্রে আপনার কমান্ড হবে।**

> **\==&gt;php artisan migrate:rollback**

> **এটাকে ডেটাবেজ এর রোলব্যাক বা ভার্সনিং ও বলে।**

  

  

  

## **DATABASE RELATION:**

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

> **অনেক গুরুত্বপূর্ন এবং অনেক কনফিউশন একটা টপিক হলো এই ডেটাবেজ রিলেশন।বেশ কয়েকধরনের রিলেশন রয়েছে ডেটাবেজ এ এর মধ্যে সাধারন অবস্থায় কিছু রিলেশন কমন ভাবে ব্যাবহার হয়ে থাকে।**

*   **\==&gt;One to One relation**
    
*   **\==&gt;One to Many relation**
    
*   **\==&gt;Many to one relation**
    
*   **\==&gt;Many to many relation**
    

  

  

## **\==&gt;ONE TO ONE RELATION**

**টাইটেল দেখেই হয়ত বুঝতে পারছি এটা একটা টেবিলের সাথে আরেকটা টেবিলের one to one relation হচ্ছে।**

**রিলেশন এর ক্ষেত্রে বেশ কয়েকটা জিনিষ গুরুত্বপূর্ন।**

## **\==&gt;FOREIGNKEY --&gt;নাম দেখে হয়ত আন্দাজ করতে পারছেন।এটা অন্য টেবিলের ইউনিক একটা কি হতে হবে।(অবশ্যই ইউনিক হতে হবে)**

**\==&gt;ম্যানুয়ালি করতে গেলে আপনার রেফারেন্স লাগবে ।**

  

## **\==&gt;ONE TO MANY RELATION**

**এক্ষেত্রে আমরা বুঝতে পারছি একটা স্যারের সাথে একাধিক ছাত্রের রিলেশন।**

  

**database বেশ কয়েকধরনের অপশন আছে one to many relation এর তবে।**

**আপনি খুব সহজেই foreignkey দিয়ে column\_name দিলে constraint এর মাধ্যমে আপনি তৈরি করে ফেলতে পারবেন।অবশ্য এক্ষত্রে Constraint ই রিলেশন তৈরি করে নেই।**

  

**public funtion orders(){**

**return $this-&gt;hasmany('orders','user\_id');**

**}**

**এখানে ইউজার টেবিলের সাথে order table এর একটি one to many relation হচ্ছে।**

  

## **\==&gt;MANY TO MANY RELATION**

> বেশ complex একটা টার্ম কারন এখানে দুই সাইড থেকে এক জনের সাথে একাধিক জনের সম্পর্ক হয়ে থাকে।এবং এর মধ্যে একটা পিভট কাজ করে।

  

> **relation এর ক্ষেত্রে একটা জিনিষ মনে রাখতে হবে up & down function এর ক্ষেত্রে।**

> **আমরা যখন কোন টেবিল drop করতে যাব সেক্ষেত্রে একটা বিষয় আমাদের মনে রাখতে হবে।আমরা কোন কলাম টি ডিলেট করব এবং কোন কলাম টি কোন টার ওপর ডিপেন্ডেন্ড।**

> **যেটার ওপরে depended সেটা পরে ডিলেট করতে হবে।**

> **যেটা অন্য একটা কলামের ওপরে ডিপেন্ড করে সেটি আগে ডিলেট করতে হবে।**

## **RELATION**

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

**many to many relation এর ক্ষেত্রে দুইটাই হবে belongstomany**

**খুব সহজেই রিলেশন তৈরি করতে পারি মডেল এর নাম ব্যাবহার করে।**

  

**//model role**

**public function users(){**

**return $this-&gt;belongstoMany(User::class);**

**}**

  

**//model users**

**public function roles(){**

**return $this-&gt;belongstoMany(Role::class);**

**}**

  

## **USER এর মধ্যে ROLE && ROLE এর মধ্যে USERS**

## **FACTORY**

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

> **নাম দেখে হয়ত বুঝতে পারছেন এটার কাজ। এখানে মূলত আমাদের কর্ম জীবনের ফ্যাক্টরির মতোই পন্য উৎপন্ন হয় তবে সেটা নির্দিষ্ট কিছু ফেইক কলামে ফেইক ডেটা।**

> **।একটি সুন্দর website কাঠামো দেখার জন্য website এ অবশ্যই content এর প্রয়োজন হয় কিন্ত develop করার সময় main content গুলো না দেওয়ার কারনে ।লারাভেল এর**

> **এই factory থেকে ডামি ডেটা আমরা ব্যাবহার করে থাকি খুব অল্প সময়েই আমাদের প্রয়োজন অনুসারে ডেটা ব্যাবহার করতে পারি।**

  

  

## **SEEDER**

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

> **বীজ বপ্ন।আমরা যখন ফ্যাক্টরি তে ডেটা তৈরি করি সেই ডেটা গুলো প্রয়োজন অনুসারে বিভিন্ন টেবিলে,কলামে দেওয়া লাগে তাই এই সিডারের প্রয়োজন হয়ে থাকে।আমাদের সীডার ফাইলের ফাংশনের মধ্যে**

> **আমরা আমাদের প্রয়োজুন অনুসারে ডেটাবেজ টেবিলের কলাম অনুসারে ডেটা জেনারেট করতে পারি।**

  

**public function definition(){**

**returnp\[**

**'name'=&gt;fake()-&gt;name(),**

**'email'=&gt;fake()-&gt;eemail()**

**\];**

**}**

  

  

**এক্ষত্রে কমান্ড টি হলোঃ**

**php artisan migrate:fresh --seed**

**এখানে migration ও করা হল আবার সীডার ও করা হলো;**

**এটি ক্লাসের ওভারভিউ এর সাথে কিছু বিষয় add করেছি।আশা করি সবাই বুঝতে পারবেন।**

**আপনারা আরো বেশি ভাল করে জানতে চাইলে প্রত্যেক টা টপিক কপি করে গুগলে সার্চ করবেন এবং সেই নির্দিষ্ট টপিক ভাল ভাবে পড়বেন আশা করি আরো অনেক কিছু জানতে পারবেন।**

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

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