نحوهی ایجاد رابطهی یک به یک بین دو جدول در لاراول
برای ایجاد رابطهی یک به یک (One to One) بین دو جدول در لاراول و بازیابی اطلاعات از آنها سناریویی به صورت زیر داریم:
دو جدول به نامهای users و profiles که هر کاربر میتواند یک پروفایل داشته باشد و هر پروفایل هم میتواند متعلق به یک دسته باشد.
پس با فرض اینکه migration و ارتباط بین جداول را به درستی ایجاد کردهایم، در دو مدل خود ارتباطات را به صورت زیر پیادهسازی میکنیم:
User
public function profile()
{
return $this->hasOne('App\Profile');
}
Profile
public function user()
{
return $this->belongsTo('App\User');
}
حالا فرض میکنم قصد دارم در یکی از کنترلرهای خود اطلاعاتی کاربرانی که role آنها برابر با student است را گرفته و اطلاعات مربوط به آنها را در هر دو جدول بازیابی کنم و به صورت 30تایی paginate کنم و بر اساس id نیز مرتبسازی دلخواه را انجام دهم:
public function index()
{
$users = User::where('role', 'student')
->orderBy('id', 'asc')->paginate(30);
return view('index', compact('users'));
}
در بخش view هم میتوان به صورت زیر عمل کرد:
نکتهی مهم و پایانی: شاید قصد داشته باشیم روی هر دو جدول خود که با هم رابطهی یک به یک دارند کوئری بزنیم و نتایج را بازیابی کنیم. نحوهی کار به صورت زیر است و من در کنترلر کوئریهای خود را روی جدولهای خود با یک anonymous function ایجاد کرده در نهایت نتیجه را به view پاس دادهام و آنجا نیز نتایج دلخواه خود را نمایش میدهم. پس کدهای قبلی خود را میتوانم به شکل زیر بازنویسی کنم:
کنترلر:
public function index()
{
$profile = Profile::with(['user' => function ($query) {
$query->where('role', 'student');
}])->where('step_one', 'completed')
->where('step_one_approved_by_admin', '!=', 'approved')
->orderBy('id', 'asc')
->paginate(30);
return view('index', compact('users'));
}
نحوه کار در قسمت view هم که قبلاً ذکر شد و کاملاً مشخص است.
لازم به ذکر است فرض من در این سناریو بر این بوده که تمام نامگذاریها در جداول طبق استانداردهای لاراول صورت گرفته و در غیر این صورت باید در مدلهای خود، پارامترهای دیگری را نیز set کرد.
توی وبسایتم سعی میکنم محتوایی که تصور کنم ارزشمنده و به بقیه کمکی میکنه رو منتشر کنم. امیدوارم از مطالب وبسایت بتونید استفاده کنید و به کارتون بیاد. در ضمن اگه پروژهی تحت وبی دارید که نیاز به برنامهنویسی و اجرا داره، میتونید با شماره انتهای صفحه با من تماس بگیرید تا در موردش با هم صحبت کنیم.