محمدسجاد دباغ
4 سال پیش توسط محمدسجاد دباغ مطرح شد
11 پاسخ

تابع نویسی در مدل لاراول

سلام
لطفا برای تابع نویسی در مدل لاراول منبع معرفی یا در صورت تجربه لطفا شرح دهید.
برای مثال دوتا تابع زیر به چه شکل یاید نوشته شود؟ (نمونه کد لطفا بفرستید)

تابع معادل سازی status

public function status()
    {
        switch ("workshops_status") {
            case 'T':
                return 'تکمیل شده';
                break;
            case 'B':
                return 'بزودی';
                break;
            case 'D':
                return 'در حال ضبط';
                break;
            default:
            return 'وارد نشده';
                break;
        }
    }

تابع محاسبه قیمت پس از تخفیف

public function workshops_price_after_discount_percentage()
    {
        return (((int)"workshops_price" * (int)"workshops_discount_percentage")/(int)100);
    }

برای هر دو تابع بالا ارور دریافت میکنم.

App\models\Workshop::status must return a relationship instance.
App\models\Workshop::workshops_price_after_discount_percentage must return a relationship instance.


ثبت پرسش جدید
Muhammad
تخصص : Back-End Developer
@muhammad 4 سال پیش آپدیت شد
0

ما در مدل توابع دیگه ای هم داریم که فقط با نوشتن عنوان ستون خودش برای هر رکورد جداگانه محاسبه میکنه.

عزیزم شما دارین به متد hasOne یه آرگومانی میدین که توقع داره رشته باشه، پس اونجا باید رشته بدین. ولی وقتی به جای یه متغیر یا پراپرتی خود Class یه رشته بذارین، PHP مظلوم از کجا تشخیص بده که منظورتون همین رشته هست یا یه پراپرتی روی Class یا یه متغیر یا اسم یه متد یا اسم یه فانکشن بیرون Class یا...

$name = 'Muhammad';
echo 'name';  // Prints name, not Muhammad!

دومیش

کجاش اشتباهه؟

شما داخل Blade دارین یه متد مدل رو بدون پرانتز صدا می‌زنین. اونم فکر کرده شما دنبال یه پراپرتی یا ارتباط به اون اسم هستین. لاراول برای پراپرتی چک می‌کنه و می‌بینه نیست، میگه پس من ارتباط رو می‌خوام! دلیل اینکه چرا چنین اتفاقی میفته رو توی کلاس HasAttributes لاراول می‌بینیم:

public function getAttribute($key)
    {
        if (! $key) {
            return;
        }

        // If the attribute exists in the attribute array or has a "get" mutator we will
        // get the attribute's value. Otherwise, we will proceed as if the developers
        // are asking for a relationship's value. This covers both types of values.
        if (array_key_exists($key, $this->attributes) ||
            array_key_exists($key, $this->casts) ||
            $this->hasGetMutator($key) ||
            $this->isClassCastable($key)) {
            return $this->getAttributeValue($key);
        }

        // Here we will determine if the model base class itself contains this given key
        // since we don't want to treat any of those methods as relationships because
        // they are all intended as helper methods and none of these are relations.
        if (method_exists(self::class, $key)) {
            return;
        }

        return $this->getRelationValue($key);
    }

نتیجه اینکه درستش اینطوریه:

<p>{{ $item->workshops_price_after_discount_percentage() }} تومان</p>

moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
-2

سلام
شما می خواهید موردی مثل وردپرس ایجاد کنید ؟
می تونید یک ستون enum برای condition به وجود بیارید. و جهت نمایش دادن کافیه چک کنید که منتشر شده هست یا نه. اگر هم که می خواهید توی چندتا قسمت از این روش استفاده کنید مثلا توی فروشگاه و مقالات می تونید یک جدول واسط ایجاد کنید و اونجا برای تمامی موارد این ستون را مورد بررسی قرار بدید.
@msdabbagh


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 4 سال پیش مطرح شد
-1

@mohaligateway
ممنونم ، به دلیل اینکه خوب سوال نپرسیدم سوالم رو تغییر دادم لطفا مجدد مطالعه بفرمایید.
متشکرم


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
-1

این روشتون اشتباه هست البته به نظر من چه کاری می خواهید انجام بدید ؟
@msdabbagh


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 4 سال پیش مطرح شد
-1

@mohaligateway
روش درست چیه؟
و سوال کردید که چه کاری می خواهید انجام بدید ؟
توابعی که نوشتم واضح هستند 🤔 دقیقا کدوم خط از کدهای بالارو درک نکردید؟

میخوام برای هر رکورد از جدول ، تابع محاسبه قیمت پس از تخفیف و تابع معادل سازی status در دسترس باشه.


Muhammad
تخصص : Back-End Developer
@muhammad 4 سال پیش آپدیت شد
-1

پیشنهاد می‌کنم پی‌اچ‌پی رو خوب مستر بشین و با پروژه شروع نکنین. پروژه برای اونه که تئوری بلده و حالا می‌خواد مهارت عملی بازار رو به دست بیاره چون نباید از چالش رفت اصول رو یاد گرفت، باید اصول رو یاد بگیرید و با اونها چالش حل کنین.

تو متد اول به switch یه رشته دادین و به جاش باید اشاره می‌کردین به مقدار ستونی که می‌خوایین. خب معلومه که رشته‌ی workshopsstatus مساوی T و B و اینها نیست.

توی تابع دوم هم دارین دوتا متن رو به عدد صحیح کست می‌کنین ، جلوتر هم 100 که خودش عدد صحیحه رو دوباره به عدد صحیح کست می‌کنین. 😑😐

بیرون مدل هم اشتباه از این دو متد استفاده کردین برای همین میگه این متدها باید Relation بدن.


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 4 سال پیش مطرح شد
0

@muhammad

تو متد اول به switch یه رشته دادین و به جاش باید اشاره می‌کردین به مقدار ستونی که می‌خوایین
معلومه که رشته‌ی workshops_status مساوی T و B و اینها نیست

ما در مدل توابع دیگه ای هم داریم که فقط با نوشتن عنوان ستون خودش برای هر رکورد جداگانه محاسبه میکنه. در صورتی که اگر رشته باشه دستور پایین هم باز باید خطا بده اما صحیح عمل میکنه.
برای مثال تابع محاسبه دسته بندی

public function categoty()
    {
        return $this->hasOne(Workshop_category::class , 'id' , 'workshops_category' );
    }

بیرون مدل هم اشتباه از این دو متد استفاده کردین برای همین میگه این متدها باید Relation بدن.

<p>{{ $item->workshops_price_after_discount_percentage }} تومان</p>

کجاش اشتباهه؟


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش آپدیت شد
0

@msdabbagh ببینید سوالی که پرسیدید گیج کننده هست. شما جدول جلوتون بازه و دارید باهاش کار می کنید و آشنا هستید اما ما نمی بینیم جدول رو اگر بتونید نمونه سوال live بزنید شاید بتونم کمکتون کنم. مثلا می خواهید مثل راکت شرایط برای دوره بزارید و براساس شرایط قیمت دوره رو تغییر بدید؟


Muhammad
تخصص : Back-End Developer
@muhammad 4 سال پیش آپدیت شد
0

ما در مدل توابع دیگه ای هم داریم که فقط با نوشتن عنوان ستون خودش برای هر رکورد جداگانه محاسبه میکنه.

عزیزم شما دارین به متد hasOne یه آرگومانی میدین که توقع داره رشته باشه، پس اونجا باید رشته بدین. ولی وقتی به جای یه متغیر یا پراپرتی خود Class یه رشته بذارین، PHP مظلوم از کجا تشخیص بده که منظورتون همین رشته هست یا یه پراپرتی روی Class یا یه متغیر یا اسم یه متد یا اسم یه فانکشن بیرون Class یا...

$name = 'Muhammad';
echo 'name';  // Prints name, not Muhammad!

دومیش

کجاش اشتباهه؟

شما داخل Blade دارین یه متد مدل رو بدون پرانتز صدا می‌زنین. اونم فکر کرده شما دنبال یه پراپرتی یا ارتباط به اون اسم هستین. لاراول برای پراپرتی چک می‌کنه و می‌بینه نیست، میگه پس من ارتباط رو می‌خوام! دلیل اینکه چرا چنین اتفاقی میفته رو توی کلاس HasAttributes لاراول می‌بینیم:

public function getAttribute($key)
    {
        if (! $key) {
            return;
        }

        // If the attribute exists in the attribute array or has a "get" mutator we will
        // get the attribute's value. Otherwise, we will proceed as if the developers
        // are asking for a relationship's value. This covers both types of values.
        if (array_key_exists($key, $this->attributes) ||
            array_key_exists($key, $this->casts) ||
            $this->hasGetMutator($key) ||
            $this->isClassCastable($key)) {
            return $this->getAttributeValue($key);
        }

        // Here we will determine if the model base class itself contains this given key
        // since we don't want to treat any of those methods as relationships because
        // they are all intended as helper methods and none of these are relations.
        if (method_exists(self::class, $key)) {
            return;
        }

        return $this->getRelationValue($key);
    }

نتیجه اینکه درستش اینطوریه:

<p>{{ $item->workshops_price_after_discount_percentage() }} تومان</p>

محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 4 سال پیش مطرح شد
0

@mohaligateway
چطور میتونم در مدل تابع دلخواه بنویسم؟ هر مدلی ( در اصل سوال تفاوت نداره که مدل و جدول چیه )

model test
public function ok()
    {
        return 'ok';
    }

و برای فراخوانی در blade هم به این شکل ok برگرده

@foreach($test as $item)
    {{ $item->ok }}
@endforeach

محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 4 سال پیش مطرح شد
0

@muhammad
متشکرم ، مشکل همان پرانتز بود که گفتید.

کد نهایی

model workshop
public function getWorkshops_priceAttribute()
    {
        return $this->workshops_price - (((int)$this->workshops_price * (int)$this->workshops_discount_percentage)/(int)100);
    }
@foreach($workshop as $item)
        <p>{{ $item->getWorkshops_priceAttribute() }} تومان</p>
@endforeach

Muhammad
تخصص : Back-End Developer
@muhammad 4 سال پیش مطرح شد
0

خواهش می‌کنم. کستینگ رو هم بردارین. اون پراپرتی‌ها یا از همه گذشته 100 نیاز به کست شدن به int ندارن.


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

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