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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

1763閲覧

Cakephp3 クエリービルダーでSELECT *,sum(hoge) as hoge_ttl FROM ~をしたいです。

aaayii

総合スコア14

MySQL

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/02/18 12:18

【やりたいこと】
・下記のようなSQL文をCakephp3 クエリービルダーで実現したいです。

SELECT *,sum(hoge) as hoge_ttl FROM hoge_table WHERE ymd='2020-02-19' group by hoge_id order by temperature,hoge_id;

【試してみたこと】
・下記実行したクエリービルダーですが、もちろんselectしたカラムのみしか取得できませんでした。
selectに一つずつほしいカラムを記述してもいいのですが、それですとcontainで定義したモジュールと紐づかない為、リレーション先の値も取得できませんでした。

Controller

1$hoge_table = $this->HogeTable->find('all',[ 2 'conditions'=>['ymd'=>'2020-02-19'], 3 'contain'=>['HogeUnit'], 4 'group'=>'hoge_id', 5 'order' => 'temperature,hoge_id ASC' 6 ]); 7$hoge_table ->select([ 8 "hoge_ttl "=>$hoge_table ->func()->sum('hoge'), 9]); 10$hoge_table = $hoge_table ->toArray();

・このようにリレーション先(hoge_unit)の値もしっかり取得できるようにしたいです。

ctp

1<?php for ($i=0; $i < count($hoge_table ); $i++) { ?> 2<tr> 3<td><?= $hoge_table [$i]->name ?></td> 4<td><?= $hoge_table [$i]->hoge_unit->name ?></td> 5</tr> 6<?php }?>

とりわけCakephp3 クエリービルダーにて、SQL文でいう「SELECT *,sum(hoge) as hoge_ttl 」の部分を実現できる方法を教えていただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

テーブルのフィールド全部をselectメソッドで指定する方法があります。

特定のフィールドを選択 | クエリービルダー - CakePHP 3.8

select($fields) を呼んで、なおもテーブルのすべてのフィールドを選択したいなら、 次の方法でテーブルインスタンスを select() に渡すことができます。

php

1// 計算された slug フィールドを含む、 articles テーブルのすべてのフィールドを取得 2$query = $articlesTable->find(); 3$query 4 ->select(['slug' => $query->func()->concat(['title' => 'identifier', '-', 'id' => 'identifier'])]) 5 ->select($articlesTable); // articles のすべてのフィールドを選択する

ということで、HogeTableとそのリレーションであるHogeUnitのテーブルクラスをselectメソッドへ与えてやればよいです。

php

1$query 2->select('hoge_ttl' => $query->func()->sum('hoge')) 3->select($this->HogeTable) 4->select($this->HogeTable->HogeUnit->getTarget()) // リレーションのTableオブジェクトを取得してセット

投稿2020/02/19 05:13

編集2020/02/19 05:14
nojimage

総合スコア959

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

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

aaayii

2020/02/21 05:49

お返事遅れてしまい申し訳ございません。 ご回答ありがとうございます。 ご回答を参考にさせていただいた結果、解決しました! 今後ともお力をお借りできればと思います
guest

0

SQL文でいう「SELECT *,sum(hoge) as hoge_ttl 」

そんな記述はできません。文法エラーです。

インラインビューを使用して下さい。
(サブクエリーでも良いですけど、インラインビューの方が高速だと思います)

SQL

1SELECT t1.*, t2.hoge_ttl 2FROM hoge_table t1 3 inner join ( 4 select hoge_id, sum(hoge) as hoge_ttl 5 from hoge_table 6 group by hoge_id 7 ) t2 8 on t1.hoge_id=t2.hoge_id 9WHERE ymd='2020-02-19' 10order by temperature, t1.hoge_id 11;

クエリービルダーでのインラインビューの記述は以下を参考に。
CakePHP3でクエリビルダーを使用してサブクエリの書き方を教えてください!

投稿2020/02/18 12:34

sazi

総合スコア25327

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

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

aaayii

2020/02/21 05:55

お返事遅れてしまい申し訳ございません。 ご回答ありがとうございます!! また違った処理でこちらは参考にさせていただきました! ありがとうございます
guest

0

selectに一つずつほしいカラムを記述してもいいのですが、それですとcontainで定義したモジュールと紐づかない為、リレーション先の値も取得できませんでした。

意味がわかりません。質問にきちんとCREATE TABLEを提示しましょう。

SELECT した列の並び毎にSUM するので、SQLの文法上
SELECT した列の並び毎にSUM... GROUP BY 列の並び毎
を明示するのが鉄の掟です。

SQL

1SELECT *,sum(hoge) as hoge_ttl 2FROM hoge_table 3WHERE ymd='2020-02-19' group by hoge_id order by temperature,hoge_id; 4 56SELECT 7 temperature 8 , hoge_id 9 , など各列の並び 10 , sum(hoge) as hoge_ttl 11FROM hoge_table 12WHERE ymd='2020-02-19' 13group by 14 temperature 15 , hoge_id 16 , 各列の並び 17order by temperature,hoge_id; 18

投稿2020/02/18 12:33

Orlofsky

総合スコア16417

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

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

aaayii

2020/02/21 05:59

お返事遅れてしまい申し訳ございません。 ご指摘ありがとうございます!! ご指摘いただいた部分はcakephp3のクエリービルダーに関しての内容です。 混同してしまい申し訳ございません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問