質問 > その他 > 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
|
ゲスト |
投稿日時: 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
|
ゲスト |
投稿日時: 2016/6/21 14:46
対応状況: −−−
|
管理画面、受注状況をクリックした際に条件を追加したい 直接的に前の内容に関係はないのですが
似ていると思われる内容がありましたので、こちらで質問させていただきます。 上の方ももしかしたら、同じような状況で今頃調べたり悩んだりしているかも?? 上の方は、表示時にもカテゴリを絞っているようですが 私は表示は絞らない予定なのですがクリックして受注検索に遷移した際にはカテゴリで絞りたいと思っています。 現状(初期)では、対象のステータスのみが検索条件に追加されている状態となります。 表示自体はAdminController.phpで行っているためそこからの処理なのかと思ったのですがうまく追えずに詰まってしまいました。 この先の処理がまだあまり理解できていないのですが、どのようにしてカテゴリ等で絞るようにできるのか ご教示お願いできれば幸いです。 よろしくお願いいたします。 |
|
DELIGHT |
投稿日時: 2016/6/21 14:59
対応状況: −−−
|
仙人 登録日: 2010/2/3 居住地: 熊本県・九州・長野県・関東甲信越 投稿: 572 |
Re: 管理画面、受注状況をクリックした際に条件を追加したい このスレッドは管理画面トップのカスタマイズが話題なのに対して
aaa1234様の仰っている箇所は受注マスタ画面の件です。 「似ている」と思われるのはaaa1234様の感覚でしかなく、 少なくとも私にとってはaaa1234様がどういう状況なのか分かりかねます。 現在の状況を整理した上で別スレッドにて投稿して下さい。
|
ゲスト |
投稿日時: 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はいくらでも出てきます。
|
DELIGHT |
投稿日時: 2016/6/22 10:26
対応状況: −−−
|
仙人 登録日: 2010/2/3 居住地: 熊本県・九州・長野県・関東甲信越 投稿: 572 |
Re: SQLの記述について 本スレッドの主旨とは違いますが、そもそも商品を分類するためのカテゴリと処理を制御するためのカテゴリが
同一のブランチの中に混在していることで様々な問題が発生しているように思います。 私だったら商品登録画面に権限フィールドを追加し、カテゴリ機能とは独立させます。 どうしてもカテゴリで実現する必要があるのであれば、下記のような構造にします。 カテゴリルート ┣食器 ┣インテリア ┗権限 ┣店舗A ┗店舗C これも叶わないようであれば、せめて制御に関するカテゴリは最上位に配置します。 カテゴリルート ┣店舗A ┃┣食器 ┃┗インテリア ┗店舗C ┣食器 ┗インテリア どういう方法を採るにせよ、設計を今一度見なおしてはいかがでしょうか?
|
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |