CakePHPのFixtureをFulltextIndex対応させる


もう年の暮れ、本当はこの一年間で悟ったN個の事みたいなエントリ書くべきかもしれないけども、今日ハマったポイントに付いて書くべきと天の声があったので書く。

CakePHP + MySQL + Groongaを使って全文検索をサクっと実装していて、Fixtureの中にGroongaのFULLTEXT INDEXを突っ込みたかったのに、

var $fields = array(
		'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
		'body' => array('type' => 'text', 'null' => true, 'default' => NULL, 'key' => 'index', 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL),
		'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL),
		'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'FULLTEXT' => array('column' => 'body(1024)')),
		'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'groonga')
	);

みたいな感じでFixtureのfieldsに書いたらエラー出たんですよ。

Google先生に聞いたところ、CakephpのFixtureがFULLTEXT INDEXに対応してないという旨を発見したので、じゃあ俺が対応させるか、ということで対応させてみた。

というわけで、その方法。
CAKEHOME/cake/libs/model/datasources/dbo_sources.php の2808行目付近のbuildIndex関数に以下を追記。

/*2808行目あたり*/
	function buildIndex($indexes, $table = null) {
		$join = array();
		foreach ($indexes as $name => $value) {
			$out = '';
            /* 追記 */
            if($name == 'FULLTEXT') {
                $out = 'FULLTEXT INDEX('.$value['column'].')';
                $join[] = $out;
                continue;
            }
            /* 追記ここまで */

こんな感じに書いておくと、Fixtureからテーブルを作る際に、FULLTEXT INDEXをちゃんと生成してくれます。
ちょっと強引な対応かもしれないけどこんな感じです。

こうすることで、

$fields = array(
                /*******省略******/
                indexes' => array(/*******省略******/, 'FULLTEXT' => array('column' => 'body(1024)')),
                /*******省略******/
                );

とfixtureに書いておけばFULLTEXT INDEXが生成される。
お役に立てれば幸い。

もっといい手があれば教えて欲しい。

コメントする

あなたのメールは 絶対に 公開されたり共有されたりしません。

次の HTML タグと属性が使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>