লারাভেল: এলোকুয়েন্ট রিলেশনশিপ — belongsTo, hasMany, belongsToMany | Laravel - Part 9.3
লারাভেলে (Laravel) ডেটাবেজের টেবিলগুলোর মধ্যে রিলেশন বা সম্পর্ক স্থাপন করতে হয়। এই লেখায় আমরা belongsTo, hasMany এবং belongsToMany রিলেশনগুলো খতিয়ে দেখবো। উদাহরণসহ একটা সহজ বাংলা ব্যাখ্যা পাবেন।
কী রে বন্ধুরা, কেমন আছেন? আজকে আমরা নিয়ে আলোচনা করবো এলোকুয়েন্ট মডেলের একটা গুরুত্বপূর্ণ অংশ — রিলেশনশিপ। ভাবছো কি হয় রিলেশন? রিলেশন হচ্ছে ডাটাবেজের টেবিলগুলোর মধ্যে সম্পর্ক বা লিঙ্ক।
যেমন ধরি, তোমার একটা ব্লগ সাইট আছে। সেখানে পোস্ট আছে, ইউজার আছে, আর কমেন্টস আছে। এখন এই তিনটা টেবিলের মধ্যে রিলেশন স্থাপন করতে হবে। কারণ একজন ইউজার অনেকগুলো পোস্ট লিখতে পারে, আর একটা পোস্টের অনেকগুলো কমেন্ট থাকতে পারে। বুঝলে তো?
এখন আসা যাক সেই রিলেশনগুলো কিভাবে লারাভেলে ডিফাইন করা হয় সেটা দেখি। আজকে আমরা belongsTo, hasMany এবং belongsToMany রিলেশনগুলোর উপর দিক দিবো।
belongsTo রিলেশন
belongsTo রিলেশন হচ্ছে একটা মডেল যখন অন্য একটা মডেলের উপর নির্ভরশীল থাকে। উদাহরণস্বরূপ, আমাদের ব্লগ উদাহরণে, একটা পোস্ট একজন ইউজারের অধীনে থাকবে। অর্থাৎ, পোস্টটি belongsTo ইউজারের।
<?php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class Post extends Model
{
public function author()
{
return $this->belongsTo(User::class);
}
}
এখানে Post
মডেলে author()
মেথডটি ডিক্লেয়ার করা হয়েছে যা belongsTo
রিলেশনটি রিটার্ন করে। এখন আমরা কোন পোস্টের লেখক জানতে চাইলে $post->author->name
এইভাবে অ্যাক্সেস করতে পারবো।
hasMany রিলেশন
hasMany রিলেশন হচ্ছে একটা ইনভার্স belongsTo রিলেশন। এটি যখন একটা মডেল অন্য অনেকগুলো মডেলের উপর নির্ভরশীল হয়। আমাদের ব্লগ উদাহরণে, একজন ইউজার অনেকগুলো পোস্ট লিখতে পারে।
<?php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
}
এখানে User
মডেলে posts()
মেথডটি hasMany
রিলেশনটি রিটার্ন করে। এখন আমরা কোন ইউজারের সকল পোস্ট পেতে পারবো $user->posts
এইভাবে।
belongsToMany রিলেশন
belongsToMany হচ্ছে একটু জটিল রিলেশন। এটা যখন একটা মডেল অন্য অনেকগুলো মডেলের সাথে সম্পর্কিত হয়, আর সেই অন্য মডেলগুলোও তাদের দিকে অনেকগুলো প্রথম মডেলের সাথে সম্পর্কিত থাকে। একটু গোলমাল লাগলো? একটা উদাহরণ দেখি।
ধরি আমাদের ব্লগে একটা পোস্টের অনেকগুলো ট্যাগ থাকতে পারে, আর একটা ট্যাগ অনেকগুলো পোস্টের সাথে সম্পর্কিত থাকতে পারে। এইখানে পোস্ট এবং ট্যাগের মধ্যে belongsToMany রিলেশন।
<?php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class Post extends Model
{
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}class Tag extends Model
{
public function posts()
{
return $this->belongsToMany(Post::class);
}
}
দেখছো, Post
মডেলে tags()
মেথডটি আর Tag
মডেলে posts()
মেথডটি belongsToMany রিলেশন রিটার্ন করছে। এখন আমরা $post->tags
দিয়ে কোন পোস্টের সকল ট্যাগ বের করতে পারবো, আর $tag->posts
দিয়ে কোন ট্যাগের সকল পোস্ট বের করতে পারবো।
রিলেশনশিপের অন্যান্য অপশন
রিলেশনগুলোর উপরে আরও কিছু অপশন আছে যেমন withPivot(), withTimestamps() ইত্যাদি। এগুলো দিয়ে আমরা রিলেশনের আচরণ কাস্টমাইজ করতে পারবো। আসো একটু দেখি।
return $this->belongsToMany(Tag::class)
->withPivot('quantity')
->withTimestamps();
এখানে withPivot()
মেথডটি আমাদের রিলেশনের পিভট টেবিলের একটা quantity
কলাম অ্যাক্সেস করার সুযোগ দিচ্ছে। আর withTimestamps()
হচ্ছে সময়ের মেটাডাটা এড করার জন্য।
ছোট্ট একটা প্রোগ্রাম
বুঝতে সহজ হবে একটু প্রোগ্রামিং উদাহরণ দেখলে। এই ছোট্ট প্রোগ্রামটি আমাদের ব্লগ অ্যাপ্লিকেশনের জন্য রিলেশনগুলো দেখাচ্ছে।
<?php
namespace App\Models;use Illuminate\Database\Eloquent\Model;class Post extends Model
{
public function author()
{
return $this->belongsTo(User::class);
} public function tags()
{
return $this->belongsToMany(Tag::class);
} public function comments()
{
return $this->hasMany(Comment::class);
}
}class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
}class Tag extends Model
{
public function posts()
{
return $this->belongsToMany(Post::class);
}
}class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
} public function author()
{
return $this->belongsTo(User::class);
}
}
এখানে আমরা Post
, User
, Tag
এবং Comment
মডেলগুলোতে রিলেশনগুলো ডিক্লেয়ার করেছি। একটু খেয়াল করলে বুঝবে যে এগুলো আমাদের ব্লগ অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় সকল রিলেশন কভার করছে।
উদাহরণস্বরূপ, আমরা $post->author->name
দিয়ে কোন পোস্টের লেখকের নাম বের করতে পারবো। অথবা $post->comments
দিয়ে সেই পোস্টের সকল কমেন্ট বের করতে পারবো। আবার $user->posts
দিয়ে একজন ইউজারের সকল পোস্ট দেখতে পারবো।
এইভাবে সহজেই আমরা রিলেশনশিপগুলোকে অ্যাক্সেস করতে পারছি। লারাভেলের এই এলোকুয়েন্ট রিলেশনশিপ আমাদের জীবনকে অনেক সহজ করে দিয়েছে।
সামারি
বুঝতে পেরেছো রিলেশনগুলো? আশা করি লারাভেলের belongsTo, hasMany এবং belongsToMany রিলেশনগুলোর ধারণাটা পরিষ্কার হয়ে গেছে। একটু অভ্যাস করলেই এগুলো আয়ত্ত করতে পারবে। যদি কোন প্রশ্ন থাকে, কমেন্টে জানাও। এগিয়ে যাওয়ার আগে আরও কিছু গুরুত্বপূর্ণ রিলেশনশিপ ফিচার দেখবো আগামী পর্বে। তখন দেখা হবে। ভালো থেকো, হ্যাপি কোডিং!