バージョン選択

フォーラム

メニュー

オンライン状況

84 人のユーザが現在オンラインです。 (72 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 84
もっと...

サイト内検索

質問 > その他 > SQLの記述について

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 2016/6/21 11:10
対応状況: −−−
SQLの記述について
すみません。恥ずかしながら、SQLの記述についてお尋ねさせていただきたいと思います。

対象ファイルは
src\Eccube\Controller\Adminの
AdminController.phpのgetSalesByDayメソッドです。

初期から記載のある
管理画面の今日分(昨日分)の売り上げ状況が表示されている部分の件数を取得しているものと思いますが
ここで、各店舗ごと自分たちの分のみにしたいと考えています

店舗ごとを切り分けるのはユーザ情報からユーザ名で取得しカテゴリ名と紐づけて絞り込む予定なのですが
初期のままでは
dtb_orderしか使用していないのでカテゴリ名が取得できません。

そのため、結合させていくのですが

dtb_orderからdtb_categoryに紐づけるために
以下の流れと考えています
dtb_order⇒dtb_order_detail
dtb_order_detail⇒dtb_product
dtb_product⇒dtb_product_category
dtb_product_category⇒dtb_category

ここのメソッドでは直接SQLが記載されているため
その内部に記載すればよいと思い

$dql =
'SELECT
SUBSTRING(CONCAT(o.order_date, \'\'), 1, 10) AS order_day,
SUM(o.payment_total) AS order_amount,
COUNT(o) AS order_count
FROM
Eccube\Entity\Order o
INNER JOIN dtb_order_detail od  ※
ON o.order_id = od.order_id  ※
WHERE
o.del_flg = 0
AND o.OrderStatus NOT IN (:excludes)
AND SUBSTRING(CONCAT(o.order_date, \'\'), 1, 10) = SUBSTRING(:targetDate, 1, 10)
GROUP BY
order_day';

このように※の部分を追加した場合は
[Semantical Error] line 0, col 270 near 'dtb_order_detail': Error: Class 'dtb_order_detail' is not defined.
このエラーが

Orderと同じように※の部分(上側の結合テーブル部分)を以下のようにした場合
INNER JOIN Eccube\Entity\OrderDetail od

[Syntax Error] line 0, col 304: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'
このエラーが出てしまいました。

対処方法などご存知の方がいましたら、ご教示お願いいただければ幸いです。
よろしくお願いいたします。
DELIGHT
投稿日時: 2016/6/21 11:25
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: SQLの記述について
ややこしいのですが、DQLはSQLとは違う言語です。
JOINに対応するのはONではなくWITHです。
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

ゲスト
投稿日時: 2016/6/21 13:43
対応状況: −−−
Re: SQLの記述について
ありがとうございました。
何とか結合の部分につきましては理解できました。


dtb_order_detailのorder_idとproduct_idを結合条件に指定したいのですが
OrderDetailのymlファイルにてorder_idとproduct_idの使用する際のIDやフィールドが定義されていなく使えないようなのですがこの場合は、ymlに追記を行う必要があるのでしょうか?
最初確認しておらずidを使用したら、order_detail_idと結合されてしまい当然のようにほしい値が取れなかったのですが…

Eccube\Entity\OrderDetail:
type: entity
table: dtb_order_detail
repositoryClass: Eccube\Repository\OrderDetailRepository
indexes:
dtb_order_detail_product_id_key:
columns:
- product_id
id:
id:
type: integer
nullable: false
unsigned: false
id: true
column: order_detail_id
generator:
strategy: AUTO
fields:
product_name:
type: text
nullable: false
product_code:
type: text
nullable: true
class_name1:
type: text
nullable: true
class_name2:
type: text
nullable: true
class_category_name1:
type: text
nullable: true
class_category_name2:
type: text
nullable: true
price:
type: decimal
nullable: true
precision: 10
scale: 0
quantity:
type: decimal
nullable: true
precision: 10
scale: 0
tax_rate:
type: decimal
nullable: true
precision: 10
scale: 0
tax_rule:
type: smallint
nullable: true
unsigned: false
manyToOne:
Order:
targetEntity: Eccube\Entity\Order
inversedBy: OrderDetails
joinColumn:
name: order_id
referencedColumnName: order_id
nullable: false
Product:
targetEntity: Eccube\Entity\Product
joinColumn:
name: product_id
referencedColumnName: product_id
nullable: false
ProductClass:
targetEntity: Eccube\Entity\ProductClass
joinColumn:
name: product_class_id
referencedColumnName: product_class_id
nullable: false
lifecycleCallbacks: { }

DELIGHT
投稿日時: 2016/6/21 13:59
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: SQLの記述について
マッピングでリレーションが設定されている場合、そのリレーションの名前自体が外部キーのフィールドを意味します。
https://github.com/EC-CUBE/ec-cube/blob/3.0.10/src/Eccube/Resource/doctrine/Eccube.Entity.Order.dcm.yml#L204
https://github.com/EC-CUBE/ec-cube/blob/3.0.10/src/Eccube/Repository/OrderRepository.php#L292


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

ゲスト
投稿日時: 2016/6/21 14:46
対応状況: −−−
管理画面、受注状況をクリックした際に条件を追加したい
直接的に前の内容に関係はないのですが
似ていると思われる内容がありましたので、こちらで質問させていただきます。
上の方ももしかしたら、同じような状況で今頃調べたり悩んだりしているかも??

上の方は、表示時にもカテゴリを絞っているようですが
私は表示は絞らない予定なのですがクリックして受注検索に遷移した際にはカテゴリで絞りたいと思っています。
現状(初期)では、対象のステータスのみが検索条件に追加されている状態となります。
表示自体はAdminController.phpで行っているためそこからの処理なのかと思ったのですがうまく追えずに詰まってしまいました。

この先の処理がまだあまり理解できていないのですが、どのようにしてカテゴリ等で絞るようにできるのか
ご教示お願いできれば幸いです。

よろしくお願いいたします。
DELIGHT
投稿日時: 2016/6/21 14:59
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: 管理画面、受注状況をクリックした際に条件を追加したい
このスレッドは管理画面トップのカスタマイズが話題なのに対して
aaa1234様の仰っている箇所は受注マスタ画面の件です。

「似ている」と思われるのはaaa1234様の感覚でしかなく、
少なくとも私にとってはaaa1234様がどういう状況なのか分かりかねます。

現在の状況を整理した上で別スレッドにて投稿して下さい。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

ゲスト
投稿日時: 2016/6/21 15:07
対応状況: −−−
Re: 管理画面、受注状況をクリックした際に条件を追加したい
申し訳ございません。

再度整理をして、別スレを立てます。
ゲスト
投稿日時: 2016/6/21 17:17
対応状況: −−−
Re: SQLの記述について
ありがとうございました。
おかげ様で、ほしい情報が取得されていることが確認できました。


EC-CUBEというかDoctrineが初めてで独自の記述方が勉強しながらですが英語のものが多く理解に時間がかかってしまっているのですが
SQL記述に関する質問でもう一つだけお聞きしてもよろしいでしょうか?

query_builderでサブクエリを使ってSQLを組む場合はどのように記述すればよいのでしょう?

ご教示いただければ幸いです。
よろしくお願いいたします。

以下に、状況の説明を載せておきます。

商品検索画面で(同じような状況が商品登録と受注検索でも使用する予定なのですが)、利用者ごとに表示されるカテゴリを絞りたいと思いましてただDoctrineでのサブクエリの記述がわかっていなったためひとまず考えがあっているかどうかという部分でハードコーディングでif文の条件分岐をさせていたのですが、やはりかっこ悪いのとたぶんセキュリティ面もあまりよくないと思いまして
コードの量も長くなってしまいますし…

商品検索を例に
SearchProductType.phpのカテゴリの部分で以下のようなSQLをquery_builderで作成したいと思っています。

・カテゴリ構成(例)
 食器
  ┣店舗A
  ┗店舗C
 インテリア
  ┣店舗B
  ┗店舗C

思惑:
ログインしているユーザ名と同じ名前のカテゴリ(カテゴリ名が店舗名になるようになっています)を取得する。

考えたSQL:
SELECT *
FORM dtb_category ca
WHERE (ca.category_id, ca.parent_category_id) IN (
SELECT Ca.category_id, Ca.parent_category_id
WHERE Ca.category_name = '取得した店舗名')

これで、取得した店舗名からカテゴリIDの同じものに対して表示を行う。
しかし、店舗Cの場合表示がこのままだと店舗Cで2個並ぶようになってしまいそれぞれの親がどちらなのかわからないという問題があります。

query_builderで作成してみたSQL
'query_builder' => function(EntityRepository $er) use($name) {
return $er->createQueryBuilder('ca')
->where('(ca.id , ca.Parent) IN (SELECT Ca.id, Ca.Parent FROM dtb_category Ca WHERE Ca.name = :name)')
->setParameter('name', $name)
->orderBy('ca.rank', 'DESC');
},
これの場合、QueryExceptionとなり
[Syntax Error] line 0, col 54: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got ','
のエラーが出てしまっています。
DELIGHT
投稿日時: 2016/6/21 18:42
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: SQLの記述について
EC-CUBE2と比べてEC-CUBE3(というよりそのフレームワーク)は
ドキュメントにせよQ&Aサイトにせよ日本語の情報が多くありません。

英語に苦戦するのは分かりますが、EC-CUBE3を自力でカスタマイズするのであれば英語の読解は必須です。

厳しいことを言うようですが、カスタマイズの規模に対してkaosan様のフレームワークに関する基礎知識が足りていません。
疑問が一つ解ければまた一つ疑問が生まれることが明白な以上、私としては地力を向上していただくために
ドキュメントへの誘導やソースコードの追い方を教える他ありません。

もしそれが叶わないようであれば、プロフェッショナルに外注するか、
より平易でSQL直書きもできるEC-CUBE2系での開発をお勧めいたします。

上記を踏まえた上で、クエリビルダでのIN句の使用方法は公式ドキュメントにあります。
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

IN句でサブクエリを使う方法までは書いてありませんが、
EXISTS句等でサブクエリを使う方法は記載されているのでそれを参考にして下さい。

"doctrine query builder subquery"で調べれば似たようなQ&Aはいくらでも出てきます。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

DELIGHT
投稿日時: 2016/6/22 10:26
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: SQLの記述について
本スレッドの主旨とは違いますが、そもそも商品を分類するためのカテゴリと処理を制御するためのカテゴリが
同一のブランチの中に混在していることで様々な問題が発生しているように思います。

私だったら商品登録画面に権限フィールドを追加し、カテゴリ機能とは独立させます。

どうしてもカテゴリで実現する必要があるのであれば、下記のような構造にします。

カテゴリルート
┣食器
┣インテリア
┗権限
 ┣店舗A
 ┗店舗C

これも叶わないようであれば、せめて制御に関するカテゴリは最上位に配置します。

カテゴリルート
┣店舗A
┃┣食器
┃┗インテリア
┗店舗C
 ┣食器
 ┗インテリア



どういう方法を採るにせよ、設計を今一度見なおしてはいかがでしょうか?


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,301名です
総投稿数は109,692件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.