آفلاین
user-avatar

عدم ذخیره مقادیری که در factory ها مشخص می شود

2 سال پیش
توسط فرهاد اشتری آپدیت شد
آفلاین
user-avatar
فرهاد اشتری ( 33102 تجربه )
2 سال پیش

با سلام
من در کار با phpunit می خوام از factory ها برای ذخیره اطلاعات fake در دیتابیس استفاده کنم.
یک نمونه کدی که استفاده کردم این جاست

use FakerGenerator as Faker;

$factory->define(AppProvinces::class, function (Faker $faker) {
    return [
        'name' => $faker->name
    ];
});

اما وقتی تست را ران می کنم در ترمینال به من خطا می دهد. ظاهرا مقدار name را در دستور insert قرار نمی دهد.
دستور insert که در متن خطا می بینم به این صورت است.

SQL: insert into province() values ()

متن خطا هم به این صورت است:

General error: 1364 Field 'name' doesn't have a default value (SQL: insert intoprovince() values ())
بهترین پاسخ انتخاب شده توسط فرهاد اشتری
آفلاین
user-avatar
فرهاد اشتری
2 سال پیش

مشکل رو متوجه شدم.
راه حل اون خیلی عجیب و دور از انتظاربود
من در متد __construct مدل Provinces
دستور زیر را فراخوانی نکرده بودم:

 parent::__construct($attributes);

در واقع متد constructor مدل من باید به صورت زیر باشد.

 public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
    }
آفلاین
user-avatar
فرهاد اشتری ( 33102 تجربه )
2 سال پیش

مشکل رو متوجه شدم.
راه حل اون خیلی عجیب و دور از انتظاربود
من در متد __construct مدل Provinces
دستور زیر را فراخوانی نکرده بودم:

 parent::__construct($attributes);

در واقع متد constructor مدل من باید به صورت زیر باشد.

 public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
    }
آنلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

با سلام
این مشکل نباید اصلا پیش بیاد و اصلا هم نباید به این راه حل نیاز باشه
شما در مدل خودتون از fillable استفاده کردید ؟

آفلاین
user-avatar
فرهاد اشتری ( 33102 تجربه )
2 سال پیش

بله استفاده کرده بودم. اما مشکل حل نشده بود. اما وقتی متغیر attributes رو به constructor کلاس والد پاس دادم مشکل حل شد.
البته الزاما نیازی نیست که در مدل مورد نظر constructor نوشته بشه. اما اگر نوشته بشه باید حتما constructor کلاس والد فراخوانی بشه.

برای ارسال پاسخ باید وارد سایت شوید