回答編集履歴

2

combineで日付オブジェクトを取り扱う方法の追記

2020/02/17 05:41

投稿

nojimage
nojimage

スコア959

test CHANGED
@@ -241,3 +241,37 @@
241
241
 
242
242
 
243
243
  なお、レコード件数によっては、データベース側でサブクエリなどを用いて希望の形式の形式を取得するSQLを発行したほうがよい場合もあります。上記はあくまでデータ件数がそこまで多くない場合の方法と考えてください。
244
+
245
+
246
+
247
+ -----
248
+
249
+
250
+
251
+ ## 追記 combineで日付オブジェクトを取り扱う
252
+
253
+
254
+
255
+ `date` フィールドが日付型だったということで、 `combine('date', 'info', 'person_id')` でIllegal offset typeエラーが生じていたようなのでその対処法です。combineは引数に関数を指定できます。これを利用してdateフィールド値を文字列として返します。
256
+
257
+
258
+
259
+ ```php
260
+
261
+ combine(static function ($entity) {
262
+
263
+ // dateフィールドの型を判定して日時型であれば文字列フォーマットして返す
264
+
265
+ if ($entity->date instanceof \DateTimeInterface) {
266
+
267
+ return $entity->date->format('Y-m-d');
268
+
269
+ }
270
+
271
+
272
+
273
+ return (string)$entity->date;
274
+
275
+ }, 'info', 'person_id')
276
+
277
+ ```

1

前提の追記

2020/02/17 05:41

投稿

nojimage
nojimage

スコア959

test CHANGED
@@ -1,4 +1,74 @@
1
- person_id, date, info のみを表示したいのであれ、[Collection::combine](https://book.cakephp.org/3/ja/core-libraries/collections.html#Cake\Collection\Collection::combine) を利用して結果セットを整形るのが手っ取り早いでしょう
1
+ こまかい表示方式はさておき、何を表示したいのかといえ `person_id別の各dateにおけるinfo`
2
+
3
+ ということは、以下のようなデータ形式が取得できればよいはずです。
4
+
5
+
6
+
7
+ ```php
8
+
9
+ [
10
+
11
+ "{person_id}" => [
12
+
13
+ "{date}" => "{info}",
14
+
15
+ ...
16
+
17
+ ],
18
+
19
+ ...
20
+
21
+ ]
22
+
23
+ // 実際にはこんな感じ
24
+
25
+ [
26
+
27
+ "2160001" => [
28
+
29
+ "2020-01-15" => 1,
30
+
31
+ "2020-01-22" => 1,
32
+
33
+ ],
34
+
35
+ "2160002" => [
36
+
37
+ "2020-01-15" => -2,
38
+
39
+ "2020-01-22" => 1,
40
+
41
+ ],
42
+
43
+ ]
44
+
45
+ ```
46
+
47
+
48
+
49
+ Tableのfindによって取得できる形は以下のようなものなので、これを変換します。
50
+
51
+
52
+
53
+ ```php
54
+
55
+ // 本当はResultSet/Entityクラスの集合だが便宜的に配列として表記
56
+
57
+ [
58
+
59
+ ['id' => 6, 'person_id' => '2160001', 'subject_id' => '481052', 'date' => '2020-01-15', 'info' => 1],
60
+
61
+ ['id' => 7, 'person_id' => '2160002', 'subject_id' => '481052', 'date' => '2020-01-15', 'info' => -2].
62
+
63
+ ...
64
+
65
+ ]
66
+
67
+ ```
68
+
69
+
70
+
71
+ 変換の方法は色々考えられるのですが、結果はResultSetなので [Collection](https://book.cakephp.org/3/ja/core-libraries/collections.html#id3) のメソッドが利用できます。なので、[Collection::combine](https://book.cakephp.org/3/ja/core-libraries/collections.html#Cake\Collection\Collection::combine) を利用して結果セットを整形するのが手っ取り早いでしょう。
2
72
 
3
73
 
4
74