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

بررسی موجود بودن کالا در سفارشات ثبت شده برای سیستم چند فروشندگیPHP

سلام دوستان دارم یک سیستم چند فروشندگی ایجاد میکنم با php mvc و در قسمتی دچار مشکل شدم ، جایی پیدا نکردم و هر جا هم پرسیدم کسی راهنمایی نکرد ، ممنون میشم کمک کنید.
کدهارو ببینید و در پایان چیزی که میخوام رو .

public function taminkala()
    {
        if ($_POST["order_code"]) {
            foreach ($_POST["order_code"] as $keys => $values)
            {
                $array = array(
                  "order_code" =>  $_POST["order_code"][$keys]
                );

                $orders = Order::where("order_code", "=", $array["order_code"])->get();
                foreach ($orders as $order)
                {
                    $products = Product::find($order->product_id);
                    $array_product = array(
                        $order->order_code => $products->product_count
                    );
                    var_dump($array_product);
                }
            }
        }
    }

خروجی var_dump این هست :

array(1) { [5898848]=> string(2) "10" }
array(1) { [5898848]=> string(2) "10" }
array(1) { [5898848]=> string(2) "10" }
array(1) { [7580630]=> string(1) "0" }
array(1) { [7580630]=> string(2) "10" }

ادمین میره داخل لیست سفارشات و سفارشاتی که وضعیتشون انتظار کالا هست رو انتخاب میکنه ، و یک دکمه ظاهر میشه و من رو به مدل taminkala هدایت میکنه ، شماره سفارشات با ایجکس به این مدل ارسال میشه.
حالا باید این بررسی انجام بشه اگر داخل هر سفارش محصولی بود که مقدارش در جدول محصولات صفر بود (7580630 دارای دو محصول هست که یکی از محصولات مقدار صفر داره در جدول محصولات) اون شماره سفارش رو ندید بگیره و ازش عبور کنه و بره سراغ سفارش بعدی یعنی 5898848 اگر در این سفارش همه محصولات با مقدار بالای صفر بودن عملیاتی رو انجام بده.

ممنون میشم راهنمایی بفرمایید.


ثبت پرسش جدید
محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

خب تا حدودی فهمیدم
شما اومدی به ازای هر سفارشی که از سمت کاربر ایدیش اومده یک درخواست زدی و اگر حلقست خب هر بار باید یک شماره سفارش باشه IN چرا گذاشته شده؟
خروجی اولی که لازمه ببینم همین $_POST["order_code"][$keys] هست که ریختخ شده داخل $array و متغییر بعدی array_order کجا استفاده شده؟
مورد دوم خروجی orders در کدی که زدی اگر برای یک سفارشه پس باید یک سفارش رو برگردونه کلا ایدیش رو
پس باز حلقه نمیخواسته و orders رو هم خروجی بگیر دقیقا قبل از foreach ($orders as $order)
مورد بعدی اگر توی یک query قراره حلقه ای بزنی که دو چیز رو با هم چک کنه و بهت نشون بده چرا از همون where استفاده نکردی؟
همه ی حلقه هات دلیلش اینه که توی query زدن با چیزی به اسم group by اشنا نیستی

در مرحله اول برو group by رو ببین مثال هاش رو از چند سایت
مورد دیگ این که پیشنهاد من همون اول هم خدمتت گفتم
بیا و برای همه ی سفارش هایی که داری کوئری بزن با group by روی خود سفارشات و به جای left join از join استفاده کن با محصولاتی که موجودی صفر دارن.
کافیه فقط id سفارش برگردونی توی این کد.
حالا خروجیت شماره سفارش هایی هست که باید unset بشه.
تا اینجا تست کن که درست باشه خروجیت و با یک کوئری بدون هیچ حلقه ای بتونی شماره سفارش های حذفی رو پیدا کنی.

مورد اخر در پایان اومدی ب ازای هر شماره سفارش مشتری هاشو پیدا کردی که ممکن نیست یک شماره سفارش چند مشتری داشته باشه
پس حلقه ی روی چند مشتری هم اضافه

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

در کل روی چیزایی که نوشتم فکر کن
کلا با دو تا کوئری بدون حلقه باید کار جمع شه.


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

سلام
ببینید چیزی که شما میخوایید با sql و join و شرط هاش باید انجام بشه چون بعد یه مدت که تعداد سفارشات و محصولاتت زیاد بشه سیستمت کند میشه
بسته ب فروشگاهت ممکنه بعد یکسال یا چند ماه این کند شدن خودشو نشون بده

حالا طبق چیزی که من فهمیدم تابعی داری product_count که برای سفارش میاد تعداد اون محصول رو میگه بهت برای شماره سفارش و اگر توی سفارش حتی یک محصول صفر داشتی بری سفارش بعدی

شما در مرحله ی اول سفارش های خودت رو با محصولات اون سفارش join بزن با شرط داشتن صفر مثلا

Order::join('products','prodcuts.order_id','orders.id')->where('products.count',0)->get();

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

حالا شما باید id این شماره سفارش ها رو جدا کنید حالا لاراول متد pluck داره در غیرش توی کد sql میتونی بزنی

بعد ک این id ها رو گرفتی میایی سفارش هایی که id اون توی این ای دی ها نیست رو برا خودت نشون میدی

یعنی خلاصش ایدی چیز هایی که نمیخوایی رو پیدا میکنی بعد میگی سفارش هایی بدون این id ها رو بده


حمید
@hamidtinker 3 سال پیش مطرح شد
0

ممنون محمد میشه یک مقدار بیشتر توضیح بدی ، چند روزه توی این مورد دارم میچرخم


حمید
@hamidtinker 3 سال پیش آپدیت شد
0

مهندس من کدم رو به این صورت نوشتم یعنی sql و یکی از محصولات در کد سفارش دیگه رو هم برابر صفر کردم و حالا دوتا شماره سفارش دارم که مقدار محصولشون صفر هست:

if ($_POST["order_code"]) {
            foreach ($_POST["order_code"] as $keys => $values)
            {
                $array = array(
                  "order_code" =>  $_POST["order_code"][$keys]
                );

                $array_order = implode(",",$array);
                $queries = 'SELECT tblorders.product_id,tblproducts.product_count,
                     tblorders.order_code FROM tblorders LEFT JOIN tblproducts 
                           ON tblproducts.id = tblorders.product_id 
                        WHERE tblproducts.product_count = 0 AND
                        tblorders.order_code IN ( ' .$array_order . ' ) ';
                $pdoInstance = DBConnection::getDBConnectionInstance();
                $statement = $pdoInstance->prepare($queries);
                $statement->execute();
                $orders = $statement->fetchAll();
                foreach ($orders as $order)
                {
                    echo $order["order_code"]. ": " . $order["product_count"] . ": " . $order["product_id"] . "<br/>" ;
                }
            }
        }

شماره سفارش :

5898848: 0: 25
7580630: 0: 24

حمید
@hamidtinker 3 سال پیش مطرح شد
0

مشکل برطراف شد ممنون از @salar.mohammad2013


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش آپدیت شد
0

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


حمید
@hamidtinker 3 سال پیش مطرح شد
0

@salar.mohammad2013 آیا به این صورت دیتابیس دچار افت سرعت نمیشه؟

if ($_POST["order_code"]) {
            foreach ($_POST["order_code"] as $keys => $values)
            {
                $array = array(
                  $_POST["order_code"][$keys]
                );

                $array_order = implode(",",$array);
                $queries = 'SELECT tblorders.product_id,tblproducts.product_count, tblorders.order_code, tblcustomers.order_code_customer FROM tblorders LEFT JOIN tblproducts 
                        ON tblproducts.id = tblorders.product_id 
                        LEFT JOIN tblcustomers
                        ON tblcustomers.order_code_customer = tblorders.order_code
                        WHERE tblproducts.product_count = 0 AND
                        tblorders.order_code IN ( ' .$_POST["order_code"][$keys] . ' ) ';
                $pdoInstance = DBConnection::getDBConnectionInstance();
                $statement = $pdoInstance->prepare($queries);
                $statement->execute();
                $orders = $statement->fetchAll();
                foreach ($orders as $order)
                {
                    if ($order["order_code"] == $order["order_code_customer"])
                    {
                        unset($_POST["order_code"][$keys]);

                    }

                }
            }
            foreach ($_POST["order_code"] as $key => $value)
            {
                $arrays = array(
                    $_POST["order_code"][$key]
                );

                $customers = Customers::where("order_code_customer", "=", $_POST["order_code"][$key])->get();
                foreach ($customers as $customer)
                {
                    $inputs["order_lack"] = 0;
                    $inputs["id"] = $customer->id;
                    $inputs["order_status"] = 7;
                    Customers::update($inputs);
                }
            }
        }

محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

من میخواستم خدمتت بگم
ببین شما دقیقا چی میخوایی از این حلقه ها؟
به هر شکلی باشه باید سعی کنی فوقش با سه تا چهارتا مثلا sql حل کنی موضوع رو
ینی تو حلقه که اصلا قرار نده
خارج حلقه داده هاتو اگر نیازه و خیلی غر ممکنه که join بشه بنا ب شرایطی بیا توی دو سه تا کد و متغییر بدست بیار
به شکلی که نیاز داری این سه مقدار رو ترکیب کن
کامل توضیح بدید ک چی میخوایید و کدتون چیکار میکنه که بهتر راهنماییتون کنم


حمید
@hamidtinker 3 سال پیش مطرح شد
0

@salar.mohammad2013
اولا ممنون از وقتی که در اختیارم میزاری
و بعد من از این کد چی میخوام؟:
من چک باکس هایی که وضعیتشون در هنگام ثبت سفارش انتظار کالا شده رو انتخاب می کنم :
توضیح تصویر رو وارد کنید

حالا شماره سفارشات رو با ایجکس به php میفرستم :

if ($_POST["order_code"]) {
            foreach ($_POST["order_code"] as $keys => $values)
            {
                $array = array(
                  $_POST["order_code"][$keys]
                );

                $array_order = implode(",",$array);
                $queries = 'SELECT tblorders.product_id,tblproducts.product_count, tblorders.order_code, tblcustomers.order_code_customer FROM tblorders LEFT JOIN tblproducts 
                        ON tblproducts.id = tblorders.product_id 
                        LEFT JOIN tblcustomers
                        ON tblcustomers.order_code_customer = tblorders.order_code
                        WHERE tblproducts.product_count = 0 AND
                        tblorders.order_code IN ( ' .$_POST["order_code"][$keys] . ' ) ';
                $pdoInstance = DBConnection::getDBConnectionInstance();
                $statement = $pdoInstance->prepare($queries);
                $statement->execute();
                $orders = $statement->fetchAll();
                foreach ($orders as $order)
                {
                    if ($order["order_code"] == $order["order_code_customer"])
                    {
                        unset($_POST["order_code"][$keys]);

                    }

                }
            }
            foreach ($_POST["order_code"] as $key => $value)
            {
                $arrays = array(
                    $_POST["order_code"][$key]
                );

                $customers = Customers::where("order_code_customer", "=", $_POST["order_code"][$key])->get();
                foreach ($customers as $customer)
                {
                    $inputs["order_lack"] = 0;
                    $inputs["id"] = $customer->id;
                    $inputs["order_status"] = 7;
                    Customers::update($inputs);
                }
            }
        }

من دوتا جدول محصولات و مشتری هارو هم جوین زدم به جدول سفارشات و محصولاتی که تعدادشون صفر هست رو از دیتابیس فراخونی کردم ، حالا در حلقه اول من اومدم شرط گذاشتم اگر شماره سفارشی که داخل جدول سفارشات هست مساوی با شماره سفارش مشتری بود ، آنست کن شماره سفارشی که به صورت پست اومده و در داخل این حلقه وجود داره ، همه چیز درست هست :

foreach ($orders as $order)
                {
                    if ($order["order_code"] == $order["order_code_customer"])
                    {
                        unset($_POST["order_code"][$keys]);
                    }
                }

بعد از اینکه شماره سفارش دارای محصول صفر رو آنست کردم بیرون این حلقه اومدم برای شماره سفارشاتی که محصولاتش صفر نیست یک حلقه دیگه زدم :

foreach ($_POST["order_code"] as $key => $value)
            {
                $arrays = array(
                    $_POST["order_code"][$key]
                );

                $customers = Customers::where("order_code_customer", "=", $_POST["order_code"][$key])->get();
                foreach ($customers as $customer)
                {
                    $inputs["order_lack"] = 0;
                    $inputs["id"] = $customer->id;
                    $inputs["order_status"] = 7;
                    Customers::update($inputs);
                }
            }

الان کل این سیستم داره درست کار میکنه و اون چیزی که میخواستم رو نوشتم ، حالا میخوام بدون راه حل بهترش چی هست ، چون صد در صد یک راه حل بهتری هم داره که بعد ها سیستم دچار کندی سرعت نشه ، چون به زودی قرار هست در روز تعداد زیادی فروشنده و مشتری وارد این سیستم بشه


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

خب تا حدودی فهمیدم
شما اومدی به ازای هر سفارشی که از سمت کاربر ایدیش اومده یک درخواست زدی و اگر حلقست خب هر بار باید یک شماره سفارش باشه IN چرا گذاشته شده؟
خروجی اولی که لازمه ببینم همین $_POST["order_code"][$keys] هست که ریختخ شده داخل $array و متغییر بعدی array_order کجا استفاده شده؟
مورد دوم خروجی orders در کدی که زدی اگر برای یک سفارشه پس باید یک سفارش رو برگردونه کلا ایدیش رو
پس باز حلقه نمیخواسته و orders رو هم خروجی بگیر دقیقا قبل از foreach ($orders as $order)
مورد بعدی اگر توی یک query قراره حلقه ای بزنی که دو چیز رو با هم چک کنه و بهت نشون بده چرا از همون where استفاده نکردی؟
همه ی حلقه هات دلیلش اینه که توی query زدن با چیزی به اسم group by اشنا نیستی

در مرحله اول برو group by رو ببین مثال هاش رو از چند سایت
مورد دیگ این که پیشنهاد من همون اول هم خدمتت گفتم
بیا و برای همه ی سفارش هایی که داری کوئری بزن با group by روی خود سفارشات و به جای left join از join استفاده کن با محصولاتی که موجودی صفر دارن.
کافیه فقط id سفارش برگردونی توی این کد.
حالا خروجیت شماره سفارش هایی هست که باید unset بشه.
تا اینجا تست کن که درست باشه خروجیت و با یک کوئری بدون هیچ حلقه ای بتونی شماره سفارش های حذفی رو پیدا کنی.

مورد اخر در پایان اومدی ب ازای هر شماره سفارش مشتری هاشو پیدا کردی که ممکن نیست یک شماره سفارش چند مشتری داشته باشه
پس حلقه ی روی چند مشتری هم اضافه

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

در کل روی چیزایی که نوشتم فکر کن
کلا با دو تا کوئری بدون حلقه باید کار جمع شه.


حمید
@hamidtinker 3 سال پیش مطرح شد
0

@salar.mohammad2013
شماره سفارش باشه IN چرا گذاشته شده : زمانی که = میزارم خطای $statement->execute(); گرفته میشه.
array_order : بجای این اومدم مستقیم خود شماره سفارش پست شده رو قرار داده بودم که بعدش داخل متغیر $array_order ، ایمپلود کردم که هر خونه آرایه رو جدا داشته باشم پس کدم شد :

tblorders.order_code IN (  '  . $array_order .  '  )

مورد دوم خروجی orders در کدی که زدی اگر برای یک سفارشه :
اینجا تک تک سفارش ها رو بررسی میکنم چون از $orders = $statement->fetchAll(); استفاده کردم.

مورد بعدی اگر توی یک query قراره حلقه ای بزنی که دو چیز رو با هم چک کنه و بهت نشون بده چرا از همون where استفاده نکردی؟
پس من میام قبل از اجرای کوئری کد رو بررسی میکنم درسته؟
یعنی $order["order_code"] == $order["order_code_customer"] رو یجای در کوئری قرار بدم!؟

مورد اخر در پایان اومدی ب ازای هر شماره سفارش مشتری هاشو پیدا کردی که ممکن نیست یک شماره سفارش چند مشتری داشته باشه
پس حلقه ی روی چند مشتری هم اضافه

ایجا بیام فایند بزنم مثل :

$customers = Customers::find($_POST["order_code"][$key])

و بعد ادامه ماجرای آپدیت دیتابیس


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

شما group by رو ببین و پیامم رو بررسی کن چند باری داداش خیلی کامل توضیح دادم.
عجله نکن تو حل موضوع
کد ساده ای نیست باید تحلیل کنی واسه خودت داری چیکار میکنی دقیقا و چه خروجی ای میگیری
حتما دقت کن توی توضیحاتم کامل


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

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