ZendFrameworkでfindAllBy{Field}メソッドを使うの再発明

ZendFrameworkでfindAllBy{Field}メソッドを使うと言う記事を見つけて、ほほう、と思ったのですが、
せっかくならfetchAllの他の引数もつかえる方が良いんじゃないのかな、と思い、書き換えてしまいました。
パラメーターが増えたため、論理削除のところは対応できなくなりました。

_callでは、関数の特定と引数の変換ができた時点で別関数にした方が良いのかな、と思いました。
$whereの型変換は手抜きです。もっと綺麗にできるはず。

<?php
/**
 * @see http://blog.apecell.com/archives/564710.html
 */
abstract class Twk_Db_Table_Abstract extends Zend_Db_Table_Abstract
{
	/**
	 * @param String $field
	 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
	 */
	public function findAllBy($field, $value, $where = null, $order = null, $count = null, $offset = null)
	{
        if ($where == null)
        	$where = array();
        else if (is_string($where))
        	$where = (array)$where;
        
        $where["`$field` = ?"] = $value;
           
        return $this->fetchAll($where, $order, $count, $offset);
	}
	
    /**
     * findAllBy[ColName]($value [, $value, $where, $order, $count, $limit])でデータアクセス
     * ColNameはcol_nameに変換される
     *
     * @param string $method
     * @param array  $args
     */
    public function __call($method, $args) {
    	$matches = array();
        if (preg_match('/^findAllBy(\w+)$/', $method, $matches)) {
        	// CamelCaseをcamel_caseに変換
            $field = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $matches[1]));
            
            $useArgs = array(null, null, null, null, null);
            for ($i = 0, $l = min(count($args), count($useArgs)); $i < $l; ++$i)
            	$useArgs[$i] = $args[$i];
            
            return $this->findAllBy($field, $useArgs[0], $useArgs[1], $useArgs[2], $useArgs[3], $useArgs[4]);
        }
        return parent::__call($method, $args);
    }
}

で、勢いで作ってみてなんですが、__callに頼るようにしてしまうと、IDEの引数型補完が利かなくなったりするので、
findAllBy{Field}を呼ぶより、findAllBy($field, ...)で呼んだ方が使い勝手が良いかもしれません。(ぉぃぉぃ

Trackback URL for this post:

http://nonn-et-twk.net/twk/trackback/161
0