صدرا حکیم
3 سال پیش توسط صدرا حکیم مطرح شد
3 پاسخ

ابهام در کش کردن روابط لاراول و استفاده از fresh

سلام دوستان
من یه تیکه کد نوشتم که مربوط به تست یک فیچر هست. ولی به یه ابهامی برخورد کردم

        $project = ProjectFactory::withTasks(1)->create();

        $this->actingAs($project->owner)
            ->patch($project->tasks[0]->path(), [
                'body' => 'Changed',
                'completed' => true
            ]);

        $this->assertCount(3, $project->activity);

        $this->patch($project->tasks[0]->path(), [
            'body' => 'Changed',
            'completed' => false
        ]);

        $project->refresh();

        $this->assertCount(4, $project->activity);

من اگر خط $project->refresh(); را پاک کنم، این تست ارور میده چون رابطه بالا کش شده و سراغ همون Activity های مدل قبلی که از دیتابیس خونده شده میره.
من این مفهموم کش شدن روابط رو متوجه نمیشم که چه موقع این کش شدن اتفاق میوفته. میشه لطفا در این رابطه و اصطلاح اون یخورده دقیق تر توضیح بدید. اگر هم لینکی از داکیومنت لاراول یا منابع دیگه هست که این مفهوم رو توضیح داده، ممنون میشم برام بفرستید چون خودم چیزی پیدا نکردم.
ممنون


ثبت پرسش جدید
محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 3 سال پیش مطرح شد
1

@sadrahkm
همون هم دقیقا همین طوری کار میکنه، یعنی دیتا رو در property ذخیره میکنه و در نتیجه چون شما تغییر اعمال کردید، دیتای قبلی میاد و شما باید دوباره درخواست رو ارسال کنید.


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 3 سال پیش مطرح شد
1

@sadrahkm
سلام.
در واقع اون کش نشده! شما یک شئ دارید که تغییراتی رو در دیتابیس اعمال می کنه اما خودش همون شئ قبل هستش در نتیجه با اینکه دیتا جدید در دیتابیس تغییر کرده، اما شما روی شئ فعلی دیتای قبلی رو دارید در نتیجه برای تازه کردن این موارد، باید دوباره از اول به دیتابیس درخواست ارسال بشه.


صدرا حکیم
تخصص : توسعه دهنده لاراول
@sadrahkm 3 سال پیش مطرح شد
0

@mohsenbostan
سلام
بله متوجه این قضیه شدم. ولی ببینید من وسط کد از رابطه $project->activity استفاده کردم و یک سری داده گرفتم. بعد دوباره توی خط اخر هم از همین رابطه استفاده کردم و اطلاعات را از دیتابیس درخواست کردم. الان قاعدتا توی خط آخر باید یه کوئری جدید به دیتابیس زده بشه که Activity های مربوط به پروژه x را برگدونه. اما اینطور نیست و دقیقا Activity ها تغییر نکرده و حتما باید از fresh استفاده بشه تا موضوع حل بشه. به همین خاطر گفتم که احتمالا کش شده. حالا بازم اگه نظری دارید ممنون میشم بفرمایید


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 3 سال پیش مطرح شد
1

@sadrahkm
همون هم دقیقا همین طوری کار میکنه، یعنی دیتا رو در property ذخیره میکنه و در نتیجه چون شما تغییر اعمال کردید، دیتای قبلی میاد و شما باید دوباره درخواست رو ارسال کنید.


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

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