質問編集履歴

3 コメントに対する追記

jef12

jef12 score 8

2016/06/30 15:02  投稿

LIMITを使用したDoctrine2のSQLの記述方法について
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;  
```
  • PHP

    37397 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    11618 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Doctrine2

    21 questions

    Doctrine 2.0はPHP(5.3.2+)のORMです。Doctrine1.2はActive Recordのパターンを使っているのに対し、Doctrine 2はData Mapperパターンを使います。Doctrineのプロジェクトはデータベースの抽象性とPHPで書かれたORMを扱うためのオープンソースのライブラリとツールの集合です。

  • EC-CUBE

    454 questions

    EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

2 コメントに対する追記

jef12

jef12 score 8

2016/06/30 14:36  投稿

LIMITを使用したDoctrine2のSQLの記述方法について
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();
```
  • PHP

    37397 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    11618 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Doctrine2

    21 questions

    Doctrine 2.0はPHP(5.3.2+)のORMです。Doctrine1.2はActive Recordのパターンを使っているのに対し、Doctrine 2はData Mapperパターンを使います。Doctrineのプロジェクトはデータベースの抽象性とPHPで書かれたORMを扱うためのオープンソースのライブラリとツールの集合です。

  • EC-CUBE

    454 questions

    EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

1 誤字ありのため修正

jef12

jef12 score 8

2016/06/30 13:46  投稿

LIMITを使用したDoctrine2のSQLの記述方法について
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');
   ->setParameter('orderId', $orderId);
$countOrderId = $qb
   ->getQuery()
   ->getSingleResult();
```
この際、メモリ不足のエラーが起きてしまったため以下のSQLに変えることにしました。
```
SELECT 1
FROM dtb_order o
WHERE o.order_number = 結合した注文番号
LIMIT 1
```
この際の、QueryBuilderでの記述方法につきまして
ご存知の方がいらっしゃいましたらご教示お願いいたします。
ヒントでも構いません。
よろしくお願いいたします。
  • PHP

    37397 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    11618 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Doctrine2

    21 questions

    Doctrine 2.0はPHP(5.3.2+)のORMです。Doctrine1.2はActive Recordのパターンを使っているのに対し、Doctrine 2はData Mapperパターンを使います。Doctrineのプロジェクトはデータベースの抽象性とPHPで書かれたORMを扱うためのオープンソースのライブラリとツールの集合です。

  • EC-CUBE

    454 questions

    EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る