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

مشکل در unique کردن فیلد هایی که داخل چند جدول هستند

سلام دوستان
امیدوار هستم که حال همتون خوب باشه
ببخشید من داخل یه پروژه ایی به مشکلی بر خوردم اگه راهنمایی کنید یه دنیا ممنون میشم
ببینید:
توضیح تصویر رو وارد کنید

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

۱- یکی از مشکلاتم این هست که من چطوری میتونم این ۳ تا فیلد رو unique ش بکنم در validation که دوباره تکرار نشه.
ببینید unique کردن این طوری هست که :
من تاریخ و زمان برگزاری رو داخل یه جدول به نام ceremony دارم و همین طور برای سالون ها هم یک جدول دیگه به نام salons دارم که کلید خارجیش اومده داخل جدول ceremony خب. که ۳ تا فیلدش به ترتیب:
celebration_date , time, salon_id هست که داخل جدول ceremony اومدن .
این سه تا رو من چطور میتونم با هم uniqueش بکنم ؟

'time'=>'required',
            'salons'=>['required','array'],
            'celebration_date' => [
                'required',
                Rule::unique('ceremonies')->where(function ($query) use ($request) {
                return $query->where('celebration_date', $request->celebration_date)
                    ->where('time', $request->time)
                    ->where('salon_id',$request->salons);
             }),
            ],

از این روش استفاده کردم ولی پاسخ گو نیست
بعد آقای موسوی گفتن که رابطه بین salon و ceremony یک رابطه چند به چند هست
بعد من هم اومدم یک جدول pivot به نام ceremony_salon ساختم خب و داخل اون جدول pivot, فیلد های ceremony_id, salon_id رو گذاشتم خب
حالا مشکل بعدی این هست که من چطور میتونم اینو uniqe ش بکنم طوری که celebration_date , time , salon_id تکرار نشن خب. اگه دقت داشته باشید salon_id داخل جدول ceremony_salon هست و celebration_date و time در جدول ceremony.

2- مشکل دومی که دارم این هست که :
ببینید :
من یه فیلدی رو تعریف کردم به نام status که در حقیقت تایپش boolean هست خب
این فیلد هم داخل جدول ceremony هست

قبل از این که ادامه بدم ...
یه موضوع دیگه این هست که من برای هر محفل عروسی که رزور میکنم که همون ceremony هستش خب: یه جدول دیگه ایی هم دارم به نام ceremony_income که در حقیقت income هر محفل رو داخلش ذخیره میکنم
ببینید
من زمانی میتونم income اون محفل عروسی رو حساب کنم که تاریخ اون یا مساوی امروز باشه یا بزرگتر از امروز باشه . چون این شرط رو گذاشتم که طرف فقط بتونه از محفلی که تاریخش به امروز رسیده income بگیره یا این که تاریخش از امروز بزرگتر باشه اوکی
این کار رو به خاطر این که کردم که بعدا داخل ceremony_income ی که در عکس زیر مشاهده میکنید کاربر رو محدوتر بکنم که فقط بتونه به محفل هایی دسترسی داشته باشه که با شرایطی که گفتم مطابقت داشته باشه:
(تاریخ icome باید یا مساوی امروز باشه یا بزرگتر از امروز باشه خب)

حالا این وسط اومدم یه فیلد جدیدی به نام status رو هم وارد جدول ceremony کردم که قبلا هم اشاره کردم خب
این فیلد نوعیتش boolean هست خب که با استفاده از یه trigger ی که در زیر مشاهده میکنید کنترولش میکنم طوری که مقدار پیش فرض این فیلد هم صفر هست.

 public function up()
    {
        DB::unprepared('
            CREATE TRIGGER flag_trigger AFTER INSERT ON `ceremony_incomes` FOR EACH ROW
            BEGIN
             UPDATE `ceremonies` SET `income`=1 where celebration_date=NEW.celebration_date AND time = NEW.time AND salon_id=NEW.salon_id;
            END
        ');
    }

کاری که این فیلد باید انجام بده این هست که وقتی که ceremony یا محفلی رزرو شد این به صورت پیش فرض صفر مقدار دهی میشه خب
ولی وقتی که کاربر income همون محفل رو حساب کرد مقدارش یک (۱) بشه خب که میخوام این کار رو با استفاده از trigger بکنم طوری که باید نظر به celebration_date ,time,salon_id تریگر خودم رو باید بنویسم .
باز هم اگه ببینید celebration_date ,time داخل جدول ceremony هستش خب و همین طور salon_id داخل جدول ceremony_salon

نمیدونم که چقدر تونستم منظور خودمو برسوم ولی فعلا کار هایی که انجام دادم همشون به ارور مواجه شدم

آیا کاری که میکنم درسته؟
اگه ایده دیگه ایی دارین خیلی ممنون میشم بهم بگید و اگر روش من درسته ارور های این روش رو اگه ذکر بکنید خیلی ممنونتون میشم
یه دنیا سپاس 😘

توضیح تصویر رو وارد کنید


ثبت پرسش جدید

به همدیگه کمک کنیم

به مهدی احمدی کمک کنید تا مشکل خودش را حل کند؛ این‌طور می‌توانیم با هم پیشرفت کنیم.

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

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