Table of Contents
いろいろ調査してみましたが、そんなに都合よくバインドしてくれるものは、ありませんでした。
ちなみにしたいことを簡単に説明すると料金テーブルがあり、そこには大人と子供の料金を配列もつカラムがあり一週間分のデータ配列でもちたい。
CREATE TABLE public.price
(
price_id integer,
adult integer[],
child integer[]
);
登録するときにphpの配列で持っている料金をINSERTしたい。
INSERT文はこんな感じ
INSERT INTO price(price_id, adult, child) VALUES (1, '{100,100,NULL,100,100,200,300}', '{50,50,NULL,50,50,100,150}');
phpの配列を直接バインドするいいものが、みつからない。postgresの配列は文字列みたいなものなのでINSERTと同じようかたちで文字列をつくり、バインドしてしまえばよいかと。以下のソースはバインドするのでなく直接か埋め込んでいますが、参考までにソースをメモ
<?php $conn = "host=localhost dbname=hoge user=postgres password=postgres"; $link = pg_connect($conn); if (!$link) { die('接続失敗'.pg_last_error()); } print('接続成功'); print('データを追加します'); $price_arr = array(); $price_arr['adult'][] = 100; $price_arr['adult'][] = 100; $price_arr['adult'][] = 'NULL'; //NULLという文字列を仕込む $price_arr['adult'][] = 100; $price_arr['adult'][] = 100; $price_arr['adult'][] = 200; $price_arr['adult'][] = 300; $price_arr['child'][] = 100; $price_arr['child'][] = 100; $price_arr['child'][] = 'NULL'; //NULLという文字列を仕込む $price_arr['child'][] = 100; $price_arr['child'][] = 100; $price_arr['child'][] = 200; $price_arr['child'][] = 300; $adult = '{'.implode(',', $price_arr['adult']).'}'; $child = '{'.implode(',', $price_arr['child']).'}'; $sql = "INSERT INTO price (price_id, adult, child) VALUES (1, '{$adult}', '{$child}')"; $result_flag = pg_query($sql); if (!$result_flag) { die('INSERTクエリー失敗'.pg_last_error()); } $close_flag = pg_close($link); if ($close_flag){ print('切断成功'); }
データをみてみると
joptional=# SELECT * FROM price; price_id | adult | child ----------+--------------------------------+-------------------------------- 1 | {100,100,NULL,100,100,200,300} | {100,100,NULL,100,100,200,300}
きちんと登録されていました。
こうやって登録してしまえば、こんなデータ取得方法もできる。
joptional=# SELECT price_id, unnest(adult),unnest(child) FROM price; price_id | unnest | unnest ----------+--------+-------- 1 | 100 | 100 1 | 100 | 100 1 | | 1 | 100 | 100 1 | 100 | 100 1 | 200 | 200 1 | 300 | 300
バッチとかであれば、配列文字列をSQLで組み立てることも可能。
いちど、配列をunnestで分解したものをもとに戻す方法
SELECT price_id ,ARRAY_AGG(adult) ,ARRAY_AGG(child) FROM ( SELECT price_id ,unnest(adult) AS adult ,unnest(child) AS child FROM price )tmp GROUP BY price_id price_id | array_agg | array_agg ----------+--------------------------------+-------------------------------- 1 | {100,100,NULL,100,100,200,300} | {100,100,NULL,100,100,200,300}