تعریف رابطههای Eloquent
در پایگاه دادههای رابطهای، جداول معمولاً با یکدیگر ارتباط دارند؛ مثلاً هر کاربر میتواند چند مقاله بنویسد و هر مقاله میتواند چند برچسب داشته باشد. Eloquent این روابط را با متدهای سادهای در داخل مدل تعریف میکند.
رابطهی یکبهچند (hasMany / belongsTo)، رایجترین نوع رابطه است:
class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
}
class Post extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
پس از تعریف این رابطه، دسترسی به دادههای مرتبط بسیار ساده میشود:
$user = User::find(1);
foreach ($user->posts as $post) {
echo $post->title;
}
$post = Post::find(1);
echo $post->user->name;
برای رابطهی چندبهچند (مثل مقاله و برچسب) از belongsToMany استفاده میشود که نیاز به یک جدول واسط دارد:
class Post extends Model
{
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}
نکتهی مهم برای بهبود کارایی، استفاده از Eager Loading با متد with() است تا از مشکل معروف N+1 Query جلوگیری شود؛ یعنی بهجای اجرای یک کوئری جداگانه برای هر رکورد، تمام دادههای مرتبط در یک یا دو کوئری بارگذاری میشوند، برای مثال:
$posts = Post::with('user')->get();