مهدی آقامحمدی
4 سال پیش توسط مهدی آقامحمدی مطرح شد
4 پاسخ

متد های eloquent

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


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
6

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

وراثت: کلاسی میتونه خواص و عملکرد های کلاس دیگه رو به ارث ببره.
و به همین شکل هست که داخل تمام مدل های 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 4 سال پیش مطرح شد
3

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


مهدی آقامحمدی
تخصص : توسعه دهنده وبسایت
@mahdi.dev 4 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
6

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

وراثت: کلاسی میتونه خواص و عملکرد های کلاس دیگه رو به ارث ببره.
و به همین شکل هست که داخل تمام مدل های 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 استفاده میشه.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش مطرح شد
1

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

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

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

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


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

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