質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

359閲覧

LaravelでSQLを動かしたい

yoheiiii

総合スコア87

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2023/02/24 05:07

編集2023/02/24 06:03

実現したいこと

  • SQLがありそれをLaravelで動かしたい

前提

下記のSQLがありこれをLaravelで動かしたい。
簡単なSQLは動くのでDBとの接続は問題なし。
INNER JOINなどのLaravelでの書き方など
まだよくわかっておりません。
宜しくお願い致します。

SELECT DISTINCT o.OrderSeq,o.OrderId, e.LoginId,e.EnterpriseNameKj, o.SiteId, s.SiteNameKj, e.SelfBillingMode,s.SelfBillingFlg,o.ClaimSendingClass FROM T_Order o INNER JOIN T_Enterprise e ON e.EnterpriseId = o.EnterpriseId INNER JOIN T_Site s ON s.SiteId = o.SiteId INNER JOIN T_ClaimHistory ch ON ch.OrderSeq = o.OrderSeq LEFT JOIN T_ClaimHistory ch2 ON ch2.OrderSeq = ch.OrderSeq AND ch2.Seq > ch.Seq AND ch2.EnterpriseBillingCode IS NULL WHERE o.ClaimSendingClass=12 AND e.SelfBillingMode IN (1,11) AND s.SelfBillingFlg=1 AND ch.EnterpriseBillingCode IS NOT NULL AND ch.ClaimPattern = 1 AND ch2.Seq IS NULL AND o.OrderSeq > 60000000 AND o.Cnl_Status = 0

試したこと

$datas = DB::table('T_Order')->distinct('T_Order.OrderSeq','T_Order.OrderId','T_Enterprise.LoginId','T_Enterprise.EnterpriseNameKj','T_Order.SiteId','T_Site.SiteNameKj','T_Enterprise.SelfBillingMode','T_Site.SelfBillingFlg','T_Order.ClaimSendingClass') ->join('T_Enterprise', 'T_Order.EnterpriseId', '=', 'T_Enterprise.EnterpriseId') ->join('T_Site', 'T_Order.SiteId', '=', 'T_Site.SiteId') ->join('T_ClaimHistory', 'T_Order.OrderSeq', '=', 'T_ClaimHistory.OrderSeq') ->leftJoin('T_ClaimHistory', function($join){ $join->on('T_ClaimHistory.OrderSeq', '=', 'T_ClaimHistory.OrderSeq', 'AND', 'T_ClaimHistory', 'T_ClaimHistory.Seq', '>', 'T_ClaimHistory.Seq', 'AND', 'T_ClaimHistory.EnterpriseBillingCode IS NULL') ->where('T_Order.ClaimSendingClass', '=', 12, 'AND', 'T_Enterprise.SelfBillingMode IN(1,11)', 'AND', 'T_Site.SelfBillingFlg', '=', 1, 'AND', 'T_ClaimHistory.EnterpriseBillingCode IS NOT NULL', 'AND', 'T_ClaimHistory.ClaimPattern', '=', 1, 'AND', 'T_ClaimHistory.Seq IS NULL', 'AND', 'T_Order.OrderSeq ', '>', 60000000, 'AND', 'T_Order.Cnl_Status', '=', 0); }) ->get();

現状

->where('T_Order.ClaimSendingClass', '=', 12, 'AND', 'T_Enterprise.SelfBillingMode IN(1,11)', 'AND', 'T_Site.SelfBillingFlg', '=', 1, 'AND', 'T_ClaimHistory.EnterpriseBillingCode IS NOT NULL', 'AND', 'T_ClaimHistory.ClaimPattern', '=', 1, 'AND', 'T_ClaimHistory.Seq IS NULL', 'AND', 'T_Order.OrderSeq ', '>', 60000000, 'AND', 'T_Order.Cnl_Status', '=', 0);

の部分にエディターで赤線がでて構文エラーになっております。
実行時エラー

Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'T_ClaimHistory' (SQL: select distinct * from `T_Order` inner join `T_Enterprise` on `T_Order`.`EnterpriseId` = `T_Enterprise`.`EnterpriseId` inner join `T_Site` on `T_Order`.`SiteId` = `T_Site`.`SiteId` inner join `T_ClaimHistory` on `T_Order`.`OrderSeq` = `T_ClaimHistory`.`OrderSeq` left join `T_ClaimHistory` on `T_ClaimHistory`.`OrderSeq` = `T_ClaimHistory`.`OrderSeq` AND `T_Order`.`ClaimSendingClass` = 12) at C:\Users\USER\backlogapi\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669 665| // If an exception occurs when attempting to run a query, we'll format the error 666| // message to include the bindings with SQL, which will make this exception a 667| // lot more helpful to the developer instead of just the database's errors. 668| catch (Exception $e) { > 669| throw new QueryException( 670| $query, $this->prepareBindings($bindings), $e 671| ); 672| } 673| Exception trace: 1 PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'T_ClaimHistory'") C:\Users\USER\backlogapi\vendor\laravel\framework\src\Illuminate\Database\Connection.php:331 2 PDO::prepare("select distinct * from `T_Order` inner join `T_Enterprise` on `T_Order`.`EnterpriseId` = `T_Enterprise`.`EnterpriseId` inner join `T_Site` on `T_Order`.`SiteId` = `T_Site`.`SiteId` inner join `T_ClaimHistory` on `T_Order`.`OrderSeq` = `T_ClaimHistory`.`OrderSeq` left join `T_ClaimHistory` on `T_ClaimHistory`.`OrderSeq` = `T_ClaimHistory`.`OrderSeq` AND `T_Order`.`ClaimSendingClass` = ?") C:\Users\USER\backlogapi\vendor\laravel\framework\src\Illuminate\Database\Connection.php:331 Please use the argument -v to see more details.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/02/24 05:11

現状のコードにおける具体的な問題点を記載してください。 どういう定義でどういうデータがあってどういう情報を取得したいが、どうなる みたいな形で。 あまり複雑なSQLだと下手にクエリビルダで組まない方が良いこともあります(主に効率とメンテナンス性で)。
yoheiiii

2023/02/24 05:18

現状ですと->whereのところで赤線になって構文自体上手くできていない状況です。
m.ts10806

2023/02/24 05:32 編集

「赤線」というのが何か分からないので、分かる情報を追記してください。 エディターが指摘しているエラーもしくは実行時にエラーが出ているのなら、そのエラーをコピペで。
yoheiiii

2023/02/24 05:37

失礼致しました。 追記いたしました。
m.ts10806

2023/02/24 05:41

「構文エラー」であればやりたいこと以前の問題でもありますので、 そのエラーをコピペで提示してください。 https://teratail.com/help/question-tips#questionTips34 実行時も同じエラーが出るということで良いですか?  エラーの解決≠やりたいことの実現 となる可能性は高いです。
yoheiiii

2023/02/24 05:48

エラー提示させて頂きました。 宜しくお願い致します。
m.ts10806

2023/02/24 05:49

); で一度オブジェクト切れてるので文頭が -> で始まってますね。
yoheiiii

2023/02/24 06:05

;削除で以前のエラーは消えました。 新たなエラーがでたのですが、構文はほぼ間違っているということでしょうか?
m.ts10806

2023/02/24 06:12

SQLの構文エラーなので、あとはエラーで出力されたSQLと元のSQLとの差分を埋めていく形になると思います。 言語問わず、クエリビルダだとこの手の問題はよく起きて調整と副作用に時間が溶けていくので、生SQLそのまま投入できる機能があるなら私はそちらを使ってしまいますね。
yoheiiii

2023/02/24 06:22

承知いたしました。 ありがとうございました。
guest

回答1

0

自己解決

$datas = DB::select(" SELECT DISTINCT o.OrderSeq,o.OrderId, e.LoginId,e.EnterpriseNameKj, o.SiteId, s.SiteNameKj, e.SelfBillingMode,s.SelfBillingFlg,o.ClaimSendingClass FROM T_Order o INNER JOIN T_Enterprise e ON e.EnterpriseId = o.EnterpriseId INNER JOIN T_Site s ON s.SiteId = o.SiteId INNER JOIN T_ClaimHistory ch ON ch.OrderSeq = o.OrderSeq LEFT JOIN T_ClaimHistory ch2 ON ch2.OrderSeq = ch.OrderSeq AND ch2.Seq > ch.Seq AND ch2.EnterpriseBillingCode IS NULL WHERE o.ClaimSendingClass=12 AND e.SelfBillingMode IN (1,11) AND s.SelfBillingFlg=1 AND ch.EnterpriseBillingCode IS NOT NULL AND ch.ClaimPattern = 1 AND ch2.Seq IS NULL AND o.OrderSeq > 60000000 AND o.Cnl_Status = 0 ");

投稿2023/02/24 07:30

yoheiiii

総合スコア87

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問