اذهب إلى المحتوى
  • 0

استخدام scope مع العلاقات في لارافيل

Amir Alsaeed

السؤال

لدي جدولين في قاعدة البيانات Department و User. وقمت بإنشاء scope ضمن مودل المستخدم user اسمه available والتابع بداخله scopeAvailable. وأحاول الحصول على جميع الأقسام department التي تحوي هذا السكوب كالتالي:

$departments = Department::with('user')->available()->get();

ولكن أحصل على الخطأ التالي:

Call to undefined method published()

وهذا هو الكود الخاص بالأقسام:

class Department extends \Eloquent
{
    public function departments()
    {
        return $this->HasMany('User');
    }
}

والكود الخاص بالمستخدمين:

class User extends \Eloquent
{
   public function department()
   {
       return $this->belongsTo('Department');
   }


   public function scopeAvailable($query)
   {
       return $query->where('available', 1);
   }

}

كيف يمكنني حل هذه المشكلة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يبدو أنك تستدعي الدالة published في مكان آخر في الكود، لأن دالة ال scope هي available لكن في هذا الكود أنت تُطبق الدالة available على النموذج Department في حين أن الدالة تم تعريفها في النموذج User:

هناك عدة حلول للمشكلة منها أن تقوم بالتالي:

$departments = Department::with(['users' => function ($q) {
  $q->available();
}])->get();

أو إنشاء دالة في النموذج Department:

public function availableUsers()
{
   return $this->users()->available();
}

كما يجب عليك تعديل العلاقة في النموذج Department:

من:

public function departments()
{
  return $this->HasMany('User');
}

إلى:

public function users()
{
  return $this->hasMany(User::class);
}

بعد ذلك عند الإستعلام تقوم بالتالي:

$departments = Department::with('availableUsers')->get();

كما يُمكنك بالطبع نقل ال scope إلى النموذح Department بهذا الشكل:

public function scopeAvailable($query)
{
  return $query->whereHas('users', function ($q) {
    return $q->where('available', 1);
  });
}

ثم يُمكنك إستخدامه بنفس الطريقة:

$departments = Department::available()
  ->with('users')
  ->get();

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استدعاء السكوب ضمن الاستعلام مع with بالشكل التالي:

$departments = Department::with(['users' => function ($q) {
  $q->available();
}])->get();

ويمكنك أيضاً بطريقة مماثلة تعريف علاقة:

public function usersAvailable()
{
   return $this->hasMany('User')->available();
   // أو
   // return $this->users()->available();
}

ثم عند الاستدعاء:

//جميع المستخدمين
$department->users;

// المستخدمين المتاحين
$department->usersAvailable;

// eager loading
$department->with('usersAvailable')->get();

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...