[CakePHP2] SQL文を貼り付けると、CakePHPのコードを生成するサービス


infinitas-cms.org というCakePHPCMSを開発している @dogmatic69 さんが、すごいものを開発してました。
なんと、SQL文をペーストすると、CakePHPのコードを生成するものです。

http://dogmatic69.com/sql-to-cakephp-find-converter


コードは3パターン出力されます。オプションを選ぶと、ClassRegistry::init経由での呼び出しパターンとか切り替え可能です。

  • findのオプションで指定する方法 find('all', $params)みたいなパターン
  • Modelのコードを出力。カスタムfindメソッドを生成するパターン
  • Paginationコンポーネントで指定するパターン

バーチャルフィールドなども考慮して出力するという素晴らしい仕様!


たとえば、下記のようなSQLを貼り付けると

select id, SUM(your_field) from foos where id = 1 and bar = 'fuga' order by buz limit 1,1;

モデルファイルのコードを生成して表示してくれます。

<?php
class Foo extends AppModel {
/**
 * Virtual fields
 * 
 * @var array
 */
	public $virtualFields = array(
		'sum_your_field' => 'SUM(your_field)',
	);

/**
 * Custom find methods
 *
 * @var array
 */
	public $findMethods = array(
		'special' => true
	);

/**
 * Special find
 *
 * @param string $state The state of the find (before or after)
 * @param array $query the query conditions
 * @param array $results the results
 *
 * @return array
 */
	protected function _findSpecial($state, $query, $results = array()) {
		if ($state == 'before') {
			$query['fields'] = array_merge((array)$query['fields'], array(
				'Foo.id',
				'Foo.sum_your_field',
			));
			$query['conditions'] = array_merge((array)$query['conditions'], array(
				'id' => '1',
				'bar' => 'fuga',
			));
			$query['order'] = array_merge((array)$query['order'], array(
				'buz' => 'asc',
			));
			$query['limit'] = 1;
			$query['offset'] = '1';

			return $query;
		}
		
		return current($results);
	}
}

まだ不完全なところもあるかもしれませんが、それなりに使える便利なサービスになりそうです。


# 本末転倒のような気がしないでもないですが。。。。