لارافيل 4:سلوك غريب على ما يسمى بطريقة سحرية ينتمي إلى العلاقة

StackOverflow https://stackoverflow.com//questions/20018719

  •  21-12-2019
  •  | 
  •  

سؤال

لدي نموذج المهمة التالي

class Task extends Eloquent {
    public function user()
    {
        return $this->belongsTo('User');
    }
}

عندما أتصل:

$task = Task::with('user')->first();

أحصل على النتيجة المتوقعة التالية:

{
    id      : 10,
    user_id : 20,
    user    : {
        id      : 20
    }
}

والاستعلام المتوقع التالي-سجل:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);

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

class Task extends Eloquent {
    public function __call($name, $arguments)
    {
        if ($name === 'user')
            return $this->belongsTo('User');

        return parent::__call($name, $arguments);
    }
}

أحصل على النتيجة المكسورة التالية:

{
    id      : 10,
    user_id : 20,
    user    : null // USER IS MISSING!
}

والاستعلام كسر التالية-سجل:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20

أنا لا أحصل على أي خطأ.لقد حاولت نفس الشيء مع belongsToMany, ، لكن هذا يعمل بشكل مثالي.

لسبب ما '20' لا تحصل على تمريرها إلى ينتمي إلى العلاقة.لذلك أتوقع __دعوة() هو اطلاق النار حتى مثيل استعلام جديد, ولكن أنا لا أفهم لماذا?

لقد قمت بتسجيل مرات _ _ دعوة () يحصل أطلقت ، ولكن إلى جانب طريقة' المستخدم ' ، فإنه لا يبدو أن الحصول على النار على الإطلاق.لذلك على حد علمي لا يمكن أن تكون المشكلة إذن.

هل كانت مفيدة؟

المحلول

هذا على الأرجح لأن لارافيل يستخدم اسم الطريقة انها داخل كمفتاح خارجي افتراضي.جرب هذا:

return $this->belongsTo('User', 'user_id');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top