رفتن به محتوای اصلی
کرگدن | ارائه‌کننده سرورهای ابری و اختصاصی
استفاده از متد withDefault در Eloquent برای حذف شرط‌های Null در ریلیشن‌ها

استفاده از متد withDefault در Eloquent برای حذف شرط‌های Null در ریلیشن‌ها

اگر در Eloquent لاراول با ریلیشن‌های null برخورد داشتید، متد withDefault یک راهکار عالی برای جلوگیری از خطاهای Trying to get property of non-object است. با این متد، به‌جای null، یک مدل پیش‌فرض برمی‌گردد که کدنویسی شما را ساده‌تر و ایمن‌تر می‌کند.

اگر با Eloquent در Laravel زیاد سر و کار دارید، احتمالاً بارها با این سناریو روبه‌رو شدید که یک ریلیشن مقدار null برمی‌گردونه و مجبور شدید قبل از دسترسی به فیلدهای اون ریلیشن، کلی شرط بنویسید که خطای Trying to get property 'x' of non-object نگیرید.

اما اخیراً با قابلیتی آشنا شدم که خیلی از این شرایط رو برام ساده‌تر کرد: متد withDefault.

🔍 متد withDefault چیه؟

در ریلیشن‌هایی مثل belongsTo، hasOne، hasOneThrough و morphOne که ممکنه مقدار null برگردونن، می‌تونید از متد withDefault استفاده کنید تا به جای null، یک مدل پیش‌فرض برگرده.

مثال:

class Post extends Model { public function author() { return $this->belongsTo(User::class)->withDefault(); } }
برای کپی کردن کد، روی دکمه کپی در بالا کلیک کنید

با این کار، وقتی یک پست هیچ نویسنده‌ای نداشته باشه، به جای اینکه null برگرده، یک شیء User خالی برمی‌گرده. یعنی:

$post->author->name
برای کپی کردن کد، روی دکمه کپی در بالا کلیک کنید

خطا نمی‌ده، بلکه فقط مقدار null یا رشته خالی برمی‌گردونه.

حتی می‌تونید مقدار پیش‌فرض رو هم مشخص کنید:

return $this->belongsTo(User::class)->withDefault([ 'name' => 'مهمان' ]);
برای کپی کردن کد، روی دکمه کپی در بالا کلیک کنید

 

⛔ روی چه ریلیشن‌هایی کار نمی‌کنه؟

مهمه بدونید که withDefault فقط روی ریلیشن‌هایی که یک مقدار (single result) برمی‌گردونن کار می‌کنه. بنابراین روی hasMany یا morphMany که کالکشن برمی‌گردونن، کاربردی نداره.

✅ نتیجه‌گیری

استفاده از withDefault باعث می‌شه:

  • کد شما خواناتر بشه

  • از خطاهای رایج null جلوگیری بشه

  • نیازی به چک کردن دستی isset یا ?-> نباشه

حتماً یه نگاهی به داکیومنت Laravel بندازید: Laravel Docs - Default Models