Zend_Db_Table_Row クラスで postgres の配列を扱おうとした => 挫折。
そのまま消すのもアレだから、ブログにでも乗っけるわ。
postgres の配列があるテーブル test
CREATE TABLE test (
key serial primary key,
data integer[]
);
PHPで普通に検索すると、配列のフィールドが「"{1,2,3,4,5}"」のような文字列になって帰ってきます。
これを普通に配列で帰ってくるようにしたかったので、
Zend の行クラスを改造してなんとかしようと思った。
<?php class My_Db_Table_Row_Test extends Zend_Db_Table_Row_Abstract { public function __set($name,$value) { switch ($name){ case 'data': parent::__set( $name, $this->_pgArrayEncode( $value ) ); break; default: parent::__set( $name, $value ); break; } } public function __get($name) { switch ($name){ case 'data': return $this->_pgArrayDecode( parent::__get( $name ) ); default: return parent::__get($name); } } private function _pgArrayEncode( array $array ) { return "{" . implode(',', $array ) . "}"; } private function _pgArrayDecode( $string ) { preg_match( '/^\{(.*)\}$/', $string, $matches ); return explode( ',', $matches[1] ); } }
こんな感じ。
テーブルオブジェクトでの使い方はこんな感じ。
<?php class My_Db_Table_Test extends Zend_Db_Table_Abstract { public function init() { parent::init(); $this->setRowClass('My_Db_Table_Row_Test'); } protected $_name = 'test'; protected $_primary = 'key'; protected $_sequence = true; }
でもとっても使い勝手悪い。
普通に Zend_Db_Select とか使った時にどうやって呼び出すんだろ?
とりあえずお蔵入りです。
decodeとencodeのメソッドだけそのうち再利用しよう。
( 関数に直して、使うときに呼び出せばいっか....
行セットに、array_filterとかで一括変換したりとか)