راکت
حل شده

متد های eloquent

4 پاسخ

سلام دوستان چرا بعضی از متد ها در Eloquent مثل find و ... پیدا نمیشه و auto complete نمیشه ؟
توضیح تصویر رو وارد کنید

ثبت پرسش جدید

پاسخ‌ها

4
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

تو برنامه نویسی شی گرا مبحثی رو داریم به نام وراثت

وراثت: کلاسی میتونه خواص و عملکرد های کلاس دیگه رو به ارث ببره.
و به همین شکل هست که داخل تمام مدل های Eloquent یه سری ویژگی های مشترک وجود داره
چون همشون از کلاس اصلی مدل در لاراول (Illuminate\Database\Eloquent\Model) ارث بری میکنند.

اما اگر داخل این کلاس دنبال متد find بگردی، پیداش نمیکنی.
اتفاقی که میفته اینه که متد اصلی که داخل این کلاس صدا زده میشه، متد newQuery هست
که اگر این متد رو دنبال کنی نهایتا ما رو به کلاس کوئری بیلدر (Illuminate\Database\Query\Builder) میرسونه.
که متدهایی مثل find و where اونجا قرار دارند.


اما اینکه لاراول چطوری متوجه میشه متدهایی مثل find رو صدا بزنه که در کلاس خودشون هستند
به علت استفاده از مجیک متد ها (magic methods) هست

    /**
     * Handle dynamic method calls into the model.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (in_array($method, ['increment', 'decrement'])) {
            return $this->$method(...$parameters);
        }

        if ($resolver = (static::$relationResolvers[get_class($this)][$method] ?? null)) {
            return $resolver($this);
        }

        return $this->forwardCallTo($this->newQuery(), $method, $parameters);
    }

این مجیک متد کارش اینه که: اگر متدی صدا زده شد و داخل کلاس وجود نداشت، به چه شکل باید مدیریت بشه.
همچنین یه متد callstatic__ هم داریم که برای متدهای static استفاده میشه.

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

چون بعضی متدها مثل find مستقیما داخل کلاس Model اصلی نیستند
و با استفاده از Magic method ها از جاهای دیگه فراخوانی میشند

مهدی آقامحمدی
مهدی آقامحمدی
@mahdi.dev

تخصص: توسعه دهنده وبسایت

میشه منظورتون رو واضح‌تر بگید
@ali.bayat

شاید پاسخ شما همین‌جا باشد

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

توضیحات فنی و دقیق علت این ماجرا رو آقای بیات بالا اشاره کردند. و علت اینکه PHPStorm هم متوجهشون نیمشه همین هست و باید گفت تقریبا متوجه شدنش هم غیر ممکن هست.

ولی برای رفع این مشکل یک پکیجی وجود داره IDE Helper که میاد با ایجاد چندتا فایل Helper به phpstrom کمک می‌کنه که این قضیه به اضافه کلی امکان دیگه رو متوجه بشه و از این به بعد در لیست Auto Complete ها پیشنهاد بده. خوبیش هم اینه که صرفا یک پکیج برای محیط development هست و نیازی به نصب و بارگزاریش روی سرور ندارید و هیچ چیز تغییر خاصی نمی‌کنه. فقط در محیط لوکال کلی کارتون رو راحت می‌کنه.

حتما در هر پروژه لاراولی نصبش کنید. زندگیتون از این رو به اون رو میشه 😉

https://github.com/barryvdh/laravel-ide-helper

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام