⭐روابط مدلها در لاراول :【عشقبازی جداول دیتابیس】!
سلام رفقا! 🌟 امروز میخواهیم وارد دنیای جذاب لاراول بشیم و یکی از مهمترین و باحالترین مفاهیمش یعنی روابط مدلها در لاراول رو بررسی کنیم. شاید شما هم مثل خیلیها توی شروع کار با لاراول، روابط جداول دیتابیس رو کمی پیچیده دیدید، اما باور کنید که وقتی این قضیه رو درک کنید، انگار یه جادوگر میشید که جداول دیتابیس رو دستکاری میکنه! 😎
پس اگه به دنبال یادگیری روابط در لاراول هستید و میخواهید بدونید چطور از Eloquent Relationship برای ساخت پروژههای حرفهای استفاده کنید، جایی اومدید که باید باشید. در این مقاله میخواهیم تمام اون روابط معروف مثل One-to-One، One-to-Many و روابط پیشرفتهتر مثل Polymorphic Relationships رو با زبانی ساده و کاربردی توضیح بدیم. هدف اینه که توی کدنویسیتون به شکل حرفهایتری از این روابط استفاده کنید و دیگه هیچ وقت گیر نکنید.
اگه به دنبال درک روابط در لاراول هستید، ما اینجا برای شما هستیم. از روابط ابتدایی تا پیشرفتهترین تکنیکها رو بررسی میکنیم تا پروژههای لاراولیتون رو با قدرت بیشتری پیش ببرید. این مقاله برای شماست که میخواهید توی دنیای عشقبازی جداول دیتابیس توی لاراول به استاد تبدیل بشید! 😜
پس اگه آمادهاید که سفر جذاب یادگیری روابط در لاراول رو شروع کنید، با ما همراه بشید و این مقاله رو ادامه بدید. قراره خیلی چیزا یاد بگیرید و کدهای بهتری بنویسید! 😉
1. یک به یک (One to One / Has One)
در این رابطه، فرض کنید هر کاربر یک پروفایل خاص دارد. یعنی هر کاربر فقط یک پروفایل به نام خودش داره و برعکس، هر پروفایل هم به یک کاربر مربوطه. خیلی شبیه به اینه که هر فرد یک کارت شناسایی داشته باشه که به اسم خودش هست و تنها یک نسخه از اون کارت شناسایی وجود داره.
در اینجا، رابطه یک به یک به این معنی است که هر کاربر یک پروفایل دارد و پروفایل فقط به یک کاربر تعلق دارد. برای نمونه، پروفایل "Reza" اطلاعات تماس و آدرس مخصوص به خودش را دارد که از طریق رابطه hasOne قابل دسترسی است.
User Model:
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
Profile Model:
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
کد نمونه:
حالا میخواهیم پروفایل کاربر را دریافت کنیم:
$user = User::find(1);
$profile = $user->profile; // پروفایل کاربر با id 1
echo $profile->phone; // 09123456789
2. یک به چند (One to Many / Has Many)
در این رابطه، هر کاربر میتونه چند تا سفارش داشته باشه، اما هر سفارش همیشه به یک کاربر خاص مربوط میشه. مثلا فرض کن که یه کاربر مثل "Reza" چند تا خرید آنلاین کرده، در حالی که هر خرید فقط به خودش مربوطه.
در اینجا، یک کاربر میتواند چندین سفارش (Order) داشته باشد. مثلا "Reza" دو سفارش خرید کرده که هرکدام به خودش تعلق داره. به همین دلیل از رابطه "یک به چند" استفاده میکنیم تا تمام سفارشات مرتبط با یک کاربر رو بگیریم.
User Model:
class User extends Model
{
public function orders()
{
return $this->hasMany(Order::class);
}
}
Order Model:
class Order extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
کد نمونه:
$user = User::find(1);
$orders = $user->orders; // تمامی سفارشات کاربر با id 1
foreach ($orders as $order) {
echo $order->total_price; // 100.00, 200.00
}
3. یک به چند معکوس (One to Many (Inverse) / Belongs To)
حالا، فرض کن که میخواهیم سفارشات هر کاربر رو پیدا کنیم. در اینجا، رابطه از سمت سفارش به سمت کاربر تغییر کرده، یعنی هر سفارش به یک کاربر تعلق داره.
در اینجا، هر سفارش متعلق به یک کاربر هست. یعنی وقتی ما به یک سفارش نگاه میکنیم، میخواهیم بدانیم که این سفارش مربوط به کدوم کاربر هست. اینجا از رابطه معکوس (Inverse) استفاده میکنیم که با belongsTo تو مدل سفارشها، کاربر مربوط به هر سفارش رو پیدا کنیم.
Order Model:
class Order extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
User Model:
class User extends Model
{
public function orders()
{
return $this->hasMany(Order::class);
}
}
کد نمونه:
$order = Order::find(1);
$user = $order->user; // کاربر سفارش با id 1
echo $user->name; // Reza
4. Has One of Many
این رابطه کمی پیچیدهتره، جایی که یک مدل میتونه یک رکورد از مجموعهای از مدلها داشته باشه. مثلا فرض کن که یک دستهبندی میتونه تنها یک محصول از چندین محصول داشته باشه.
در اینجا، یک دستهبندی میتونه فقط یک محصول خاص رو داشته باشه که در اینجا از رابطه Has One of Many استفاده میکنیم.
Category Model:
class Category extends Model
{
public function product()
{
return $this->hasOne(Product::class);
}
}
Product Model:
class Product extends Model
{
public function category()
{
return $this->belongsTo(Category::class);
}
}
کد نمونه:
$category = Category::find(1);
$product = $category->product; // محصول اولین دستهبندی
echo $product->name; // Mobile Phone