EC-CUBE3.0.10において、注文番号をカスタマイズしランダムにて設定しているためすでに存在している注文番号との重複チェックを行う必要があります。
まず、以下のようなSQLを作成しこれをQueryBuilderにて作成しました。
作成したSQL
SELECT COUNT(o.order_number) FROM dtb_order o WHERE o.order_number = 結合した注文番号
QueryBuilderにて作成
$qb = $em->getRepository('Eccube\Entity\Order') ->createQueryBuilder('o') ->select('COUNT(o.order_number)') ->where('o.order_number = :orderId') ->setParameter('orderId', $orderId); $countOrderId = $qb ->getQuery() ->getSingleResult();
この際、メモリ不足のエラーが起きてしまったため以下のSQLに変えることにしました。
SELECT 1 FROM dtb_order o WHERE o.order_number = 結合した注文番号 LIMIT 1
この際の、QueryBuilderでの記述方法につきまして
ご存知の方がいらっしゃいましたらご教示お願いいたします。
ヒントでも構いません。
よろしくお願いいたします。
追記
・QueryBuilderで作成した新SQL
$qb = $em->getRepository('Eccube\Entity\Order') ->createQueryBuilder('o') ->select('COUNT(o.order_number)') ->where('o.order_number = :orderId') ->setParameter('orderId', $orderId) ->setMaxResults(1); $countOrderId = $qb ->getQuery() ->getSingleResult();
2016/06/30 14:55 追記
$em = $this->app['orm.em']; $num = 4;←ランダム取得は4桁とする $array = range(0, 9);←0~9までを配列に格納する // 注文日をシステム日付から取得する $today = date("y/m/d");←システム日付をyymmddの形式で取得 $year = substr($today, 0, 2);←日付のyy部分を取得 $month = substr($today, 3, 2);←日付のmm部分を取得 $day = substr($today, -2);←日付のdd部分を取得 $flg = 0;←重複フラグを設定 while ($flg == 0) {←重複フラグが0の間ループを回す shuffle($array);←0~9の配列をシャッフルする $orderNum = substr(implode($array), 0, $num);←シャッフルした配列を左から4桁分取得する // 注文番号を10桁に結合する(月+日+年+ランダム4桁) $orderId = $month.$day.$year.$orderNum;←mmddyy+ランダム4桁で結合する // チェックデジットを取得する $cd = $this->editOrderNumber($orderId); $editOrderNum = $orderId.$cd; // TODO DBを確認し、同じ注文番号がないこと。 $qb = $em->getRepository('Eccube\Entity\Order') ->createQueryBuilder('o') ->select('COUNT(o.order_number)') ->where('o.order_number = :orderId') ->setParameter('orderId', $editOrderNum) ->setMaxResults(1); $countOrderId = $qb ->getQuery() ->getResult(); if ($countOrderId == 0) {←カスタマイズした注文番号が0件の場合はフラグを立てる。1件存在する場合は再度処理を行うためフラグ操作はしない。 $flg = 1; } } return $editOrderNum;
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。