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

السؤال

نشر

لدي جدولين في قاعدة البيانات المستخدم user و المنشور post، وكل مستخدم لديه مجموعة من posts. وقمت بتعريف العلاقة ضمن مودل المستخدم كالتالي:

public function post(){
    return $this->hasmany('post');
}

وضمن post:

public function user(){
    return $this->belongsTo('user');
}

والآن أرغب بدمج الجدولين السابقين وفقاً لعمود معيّن،  فحاولت كتابة التابع التالي ضمن post لأحصل على بيانات المستخدم أيضاً:

public function getAllPosts() {
    return Post::with('user')->get();
}

ولكن نتيجة الاستعلام تكون بهذا الشكل:

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

ولكن لا أريد الحصول على كافة بيانات المستخدم، وإنما فقط بعض الحقول، مثال:

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

فكيف يمكنني استثناء باقي حقول الجدول والحصول فقط على أعمدة محددة من الاستعلام؟

Recommended Posts

  • 0
نشر

يمكنك إضافة تابع closure ضمن الاستعلام بالشكل التالي:

Post::query()
    ->with(array('user' => function($query) {
        $query->select('id','username');
    }))
    ->get();

بحيث يتم استعادة القيم المررة ضمن select بدلاً من كامل الجدول. ووفقاً للتوثيق الرسمي يجب دوماً إضافة الحقل id وأي مفتاح ثانوي آخر موجود ضمن الجدول في هذا الإجراء لضمان الحصول على البيانات المطلوبة.

وبدءً من نسخة laravel 5.5 أصبح يمكننا استخدام التالي للحصول على النتيجة نفسها:

Post::with('user:id,username')->get();

أو

public function user()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}



وبشكل مختصر في النسخ الحديثة يمكنك استخدام التوابع السهمية:
PHP 7

Post::with(['user' => fn ($query) => $query->select('id','username')])->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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...