今回はこちらを参考に、csDoctrineActAsSortablePluginを使ってみました。
$ ./symfony plugin:install csDoctrineActAsSortablePlugin >> plugin installing plugin "csDoctrineActAsSortablePlugin" >> sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ... >> sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz >> sfPearFrontendPlugin (6,795 bytes) >> sfPearFrontendPlugin . >> sfPearFrontendPlugin . >> sfPearFrontendPlugin ...done: 6,795 bytes >> sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin" >> sfSymfonyPluginManager Installing web data for plugin
使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。
ModelName: actAs: Timestampable: ~ Sortable: ~
これで、自動的にpositionというbigintのカラムが生成されて、ソート順が数字で指定できるようになります。
併せて順序を入れ替えるための便利なメソッドが使えるようになります。
http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme
今回、I18nの下にSortableを置いたら、インデックス名がやたら長くなってしまい、CREATE文でエラーが出るようになってしまいました。
SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name '******_*********_***_*******_******_*****_translation_position_sortable_idx' is too long.
plugins/csDoctrineActAsSortablePlugin/lib/template/Sortable.php
protected function getSortableIndexName() { return sprintf('%s_%s_%s', $this->getTable()->getTableName(), $this->_options['name'], $this->_options['indexName']); }
ということなので、nameとindexNameを指定して短くできそうです。
と言ってもposition_sortable分しか短くできないのですけど。
最終的には、schema.ymlの方でtableNameをdatabase_name.table_nameで指定していたのですが、これをtableName: table_nameにするだけで対応できました。