Method select does not exist.
selectというメソッドは存在しません
というエラーですね。
リファレンスから、get()はIlluminate\Support\Collectionを返します。
getメソッドは、PHPのstdClassオブジェクトのインスタンスを結果として含む、Illuminate\Support\Collectionを返します。各カラムの値は、オブジェクトのプロパティとしてアクセスできます。
コードを追ってみれば分かりますが、下記の通り、Illuminate\Support\Collectionにはselect()はありません。そのためのエラーです。
/**
- @property-read HigherOrderCollectionProxy $average
- @property-read HigherOrderCollectionProxy $avg
- @property-read HigherOrderCollectionProxy $contains
- @property-read HigherOrderCollectionProxy $each
- @property-read HigherOrderCollectionProxy $every
- @property-read HigherOrderCollectionProxy $filter
- @property-read HigherOrderCollectionProxy $first
- @property-read HigherOrderCollectionProxy $flatMap
- @property-read HigherOrderCollectionProxy $groupBy
- @property-read HigherOrderCollectionProxy $keyBy
- @property-read HigherOrderCollectionProxy $map
- @property-read HigherOrderCollectionProxy $max
- @property-read HigherOrderCollectionProxy $min
- @property-read HigherOrderCollectionProxy $partition
- @property-read HigherOrderCollectionProxy $reject
- @property-read HigherOrderCollectionProxy $sortBy
- @property-read HigherOrderCollectionProxy $sortByDesc
- @property-read HigherOrderCollectionProxy $sum
- @property-read HigherOrderCollectionProxy $unique
- Class Collection
*/
ただ、見ての通りsumはあるので下記のようにすれば良いのでは。
※データは簡易に作った下記で確認
sql
1DROP TABLE IF EXISTS sales_data;
2CREATE TABLE sales_data (
3 id integer NOT NULL,
4 name varchar(10) NOT NULL,
5 order_id integer NOT NULL,
6 total integer NOT NULL,
7 date date NOT NULL,
8 CONSTRAINT sales_data_pkey PRIMARY KEY (id, order_id)
9 );
10
11insert into sales_data (id, name, order_id, total, date)
12values
13 (
14 '1', 'test', '1', '10', '2018-10-09'
15 );
16insert into sales_data (id, name, order_id, total, date)
17values
18 (
19 '2', 'test', '2', '9', '2018-10-09'
20 );
21insert into sales_data (id, name, order_id, total, date)
22values
23 (
24 '2', 'test', '3', '8', '2018-10-09'
25 );
26insert into sales_data (id, name, order_id, total, date)
27values
28 (
29 '3', 'test', '4', '2', '2018-10-09'
30 );
31insert into sales_data (id, name, order_id, total, date)
32values
33 (
34 '2', 'test', '5', '3', '2018-10-10'
35 );
36insert into sales_data (id, name, order_id, total, date)
37values
38 (
39 '2', 'test', '6', '4', '2018-10-08'
40 );
41
php
1$sub = DB::table("sales_data")->whereDate("date","=","2018-10-09")
2 ->groupBy('order_id','id')
3 ->get();
4dd($sub->sum("total"));
5//29
※こっそりなおしましたが、正確にはGROUPBYではなくgroupByです。メソッド名は大文字小文字大別しないPHPですが、正確に記載されたほうがトラブル少なくて済みます。
ただ、結果は(文字列か数字かはともかく)下記と同じです。
php
1dd(DB::table("sales_data")->whereDate("date","=","2018-10-09")->sum("total"));
2//"29"
group by 本当に必要?
いう疑問はぬぐえません。
欲しい結果がこれで良いのでしたらgroup byせずにsumした方が効率的にも速度的にもいいですし、
そうでないなら「こういうデータでこういう結果が欲しい」というのを具体的に例示してください。
蛇足:
sales_dataというデータですが、shop_flgとかshop_nameって必要なんでしょうか。
shopのマスターテーブルがあるならそちらから引っ張ってくるようにすべきと。
「そのときの店舗名」というなら仕方がないかもしれませんが、
そうであったとしてもそこまで頻繁にかわるものでもないでしょうし、もっと効率的なデータの持ち方があるように思います。