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とかで一括変換したりとか)