سلام دوستان.
من یه جدول دارم به نام orders، یه جدول هم دارم به نام deliveries.
سامانه ای که دارم روش کار میکنم شبیه اسنپ هست.
داخل مدل Order اومدم یه static array به صورت زیر تعریف کردم:
public static array $ORDER_DELIVERY_STATUSES = [
'going_to_source' => 'در حال حرکت به مبدا',
'reach_to_source' => 'به مبدا رسید',
'loading_done' => 'بارگیری انجام شد',
'going_to_dest' => 'در حال حرکت به مقصد' ,
'reach_to_dest' => 'به مقصد رسید',
'unloading_done' => 'بار تخلیه شد',
'returning_to source' => 'در حال بازگشت به مبدا',
'return_to_source' => 'به مبدا بازگشت',
'done' => 'سفارش به پایان رسید',
];
یه جدولم دارم به نام delivery_order که به صورت زیر هست:
Schema::create('delivery_order', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id')->constrained('orders')->cascadeOnUpdate()->cascadeOnDelete();
$table->foreignId('delivery_id')->constrained('deliveries')->cascadeOnUpdate()->cascadeOnDelete();
$table->enum('status', array_keys(Order::$ORDER_DELIVERY_STATUSES));
$table->timestamps();
});
حالا میخوام وقتی راننده یه سفارش رو قبول کرد، status در مرحله اول، درحال حرکت به مبدا باشه و بعد به ترتیب بتونه تغییر بده، یعنی وقتی در حال حرکت به مبدا رو زد، حالا بهش به مبدا رسید رو نشون بده و همینطور تا آخر.
اینم بگم که با api دارم اینکارو انجام میدم.
خودم واسه مرحله اول اومدم به صورت زیر نوشتم ولی نمیدونم دارم درست میرم یا نه؟
public function orderDeliveryStatuses(Request $request)
{
$order = Order::findOrFail($request->order_id);
$delivery_order = DeliveryOrder::create([
'delivery_id' => $request->get('delivery_id'),
'order_id' => $order->id,
'status' => 'going_to_source'
]);
return new DeliveryOrderResource($delivery_order);
}
ممنون میشم راهنمایی کنید.
خب شما باید این جدولتونو کلا حذف کنید و داخل جدول orders یه فیلد به نام delivery_id به صورت کلید خارجی تعریف کنید و در ابتدا null باشه، دلیل null بودن هم این هست که زمانی که یه سفارش ثبت میشه هنوز راننده ای اونو قبول نکرده که میشه به صورت زیر:
$table->foreignId('delivery_id')->nullable()->constrained('deliveries')->cascadeOnUpdate()->cascadeOnDelete();
همچنین داخل جدول orders یه فیلد دیگه هم به مثلا به نام delivery_status اضافه کنید که اینم در ابتدا باید null باشه و دلیلش هم میشه همون دلیل بالا و طبق کدی که داخل مدل Order واسه وضعیت راننده قرار دادین، داخل جدول orders میتونید این فیلد رو به صورت زیر تعریف کنید:
$table->enum('delivery_status', array_keys(Order::$ORDER_DELIVERY_STATUSES))->nullable();
برای مشخص کردن هر مرحله هم کدتونو به صورت زیر بنویسید:
public function deliveryStatus(Request $request, Order $order)
{
$order->update([
'delivery_id' => $request->delivery_id,
'delivery_status' => $request->delivery_status
]);
return new OrderResource($order);
}
موفق باشید.
سلام به شما دوست عزیز.
به نظرم اشتباه دارین میرین جلو، رابطه راننده با سفارش قاعدتا باید یک به چند باشه ولی ظاهرا شما چند به چند تعریف کردید، درسته؟
@rezajahangir
بله یک به چند هست، در واقع مشکل اصلی من اینه که چطور، بعد از اینکه راننده هر مرحله رو به پایین رسوند کلمه بعدی رو بهش نشون بدم، مثلا تو مرحله اول وقتی سفارش رو قبول کرد، دکمه در حال حرکت به مبدا بهش نشون داده بشه، بعد به مبدا رسید و الی آخر
خب تو میای به راننده ها سفارشاتی که هستن و کسی نگرفته رو نشون میدی بعد میاد قبول میکنه .
حالا وقتی قبول کرد تازه میای سفارش مسیر رو میسازی و وضعیتش رو میزاری رو مرحله شروع ( دیفالت هم میتونی بزاری که وقتی رکورد ساخته شد خودش وضعیتش مرحله شروع باشه )
بعد وقتی رسید به مقصد خود راننده باید بگه که من رسوندم به مقصد پس میاد یه دکمه میزنه تو میای وضعیت سفارش مسیر رو به انجام شده تغیر میدی ( آپدیت میکنی ).
خب شما باید این جدولتونو کلا حذف کنید و داخل جدول orders یه فیلد به نام delivery_id به صورت کلید خارجی تعریف کنید و در ابتدا null باشه، دلیل null بودن هم این هست که زمانی که یه سفارش ثبت میشه هنوز راننده ای اونو قبول نکرده که میشه به صورت زیر:
$table->foreignId('delivery_id')->nullable()->constrained('deliveries')->cascadeOnUpdate()->cascadeOnDelete();
همچنین داخل جدول orders یه فیلد دیگه هم به مثلا به نام delivery_status اضافه کنید که اینم در ابتدا باید null باشه و دلیلش هم میشه همون دلیل بالا و طبق کدی که داخل مدل Order واسه وضعیت راننده قرار دادین، داخل جدول orders میتونید این فیلد رو به صورت زیر تعریف کنید:
$table->enum('delivery_status', array_keys(Order::$ORDER_DELIVERY_STATUSES))->nullable();
برای مشخص کردن هر مرحله هم کدتونو به صورت زیر بنویسید:
public function deliveryStatus(Request $request, Order $order)
{
$order->update([
'delivery_id' => $request->delivery_id,
'delivery_status' => $request->delivery_status
]);
return new OrderResource($order);
}
موفق باشید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟