نحوه‌ی ایجاد رابطه‌ی یک به یک بین دو جدول در لاراول و بازیابی اطلاعات لازم از هر دو جدول با استفاده از مدل‌ها

برای ایجاد رابطه‌ی یک به یک (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 است را گرفته و اطلاعات مربوط به آن‌ها را در هر دو جدول بازیابی کنم و به صورت ۳۰تایی 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 کرد.

درباره نویسنده: احسان

مطالب زیر را حتما بخوانید