何をした?
operationsテーブルから"第三工種"というカラムで重複するレコードに付随しているデータの塊を作りたいと考えました。
具体的には"第三工種"に"土工"というレコードが複数ある場合、それ以降の”第四工種”以降が"埋め戻し"のものや”掘削"のものなどに分岐します。
それを”第三工種に土工を持つもの全て"で一括りの配列にして、呼び出したいと考えました。
失敗した方法
ひとことで言うと、クエリによる処理でなく配列処理で対応しようとしたらドツボにはまりました。
※詳細(分かりにくいので、お急ぎの方は読まなくて大丈夫です)
まずテーブルから全レコードを呼び出し、distinct()
で重複を絞った後、その"id"を持つ"第三工種"を抜き出します。その"第三工種"のレコードを持つものをforeach
とarray_keys()
により、distinct()
してないものと比較することで新しい1次配列を作り、そこからviewに呼び出そうとしました。
→array_key()
はオブジェクトに対して使えないというエラーで挫折しました。
コレクションを使えばいけるかもしれなかったですが、1次配列にしてしまうと呼び出しも厄介なので中断しました。
→代案で"id"を抽出した後、全て入ったデータからarray_column()
でそれぞれのカラムを抜き出して、呼び出しの時に該当のidを使って呼び出すことを考えましたが、array_column()
もオブジェクトに対して使えないというエラーが出たので中断しました。
解決方法
下記のsqlをコントローラで書き出して、”第三工種”が同じものだけの配列にまとめることで対応しました。
SELECT
operations.id,
operations.third_operation_class
FROM
-- サブクエリで件数を取得
(
SELECT
third_operation_class,
COUNT(third_operation_class) AS CNT
FROM
operations
GROUP BY
third_operation_class
) AS third_operation_class_CNT
-- 自己結合
INNER JOIN
operations
ON
third_operation_class_CNT.third_operation_class = operations.third_operation_class
AND
third_operation_class_CNT.CNT > 0;
#上記の結果
id third_operation_class
8 お試し3
9 河川土工
16 土工
17 土工
18 土工
19 土工
20 土工
21 土工
22 土工
その後
この記述で他のカラムも呼び出して、"third_operation_class"が同じものだけでまとめることで、欲しい値だけの配列ができるので、そこにforeachでインデックス番号をふって、そのインデックス番号でページを分けて表示しました。