Doctrineのupdateの仕方が美しくない
Timestamp/Date/DateTime型だとエラーになる
普通に書くとこんな感じになるけど、エラーになる
<?php Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', date('Y-m-d H:i:s')) ->execute(); #=> syntax error Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', "'".date('Y-m-d H:i:s')."'") ->execute(); #=> ok
どうせだったら、日付書式か、DateTimeクラスを認識するようにすればよかったのに
<?php Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', new DateTime()) ->execute(); Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', date('Y-m-d H:i:s')) ->execute();
NULLが認識されない
<?php Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', null) ->execute(); #=> syntax error Doctrine::getTable('Foo')->createQuery('f') ->update() ->set('f.bar', 'NULL') ->execute(); #=> ok
これも内部で===を利用してnull判定をして、自動でnullを挿入すべきだと思う
Doctrine_Record#set()との挙動に違いがあるので、初めてupdate()を使うときは必ずエラーになるかも
次のバージョンでは対応されそうだけど、symfonyに取り込まれないと使えないしなぁ
sfJpMobilePluginを0.0.3にUP
Doctrine_Pager_Layoutの使い方
Doctrineに付属しているPagerクラス。
Pagerだけでは、ページングのナンバーリンクの自動生成はできない。
そこで、包括的なDoctrine_Pager_Layoutを利用するようにするとPagerもRangeも同時に利用することが可能。
しかし、Pager_Layoutの生成はちょっと煩雑。
<?php $pager = new Doctrine_Pager( $query, $currentPage, $perPage); $layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), $urlMask );
こんな感じなので、Actionに書くより、モデル内なりに入れてしまったほうがいい。
よく使うメソッド
メソッド名 | 返り値 | 説明 |
---|---|---|
Pager#execute() | Doctrine_Collection | 現在のページで表示する分のデータを取得する |
Pager_Layout#display() | null | ナンバーリンクを出力する |
Pager#haveToPaginate() | boolean | ページネイトする必要があるか(1ページしかないかどうか) |
Pager#getPreviousPage() | integer | 前のページNo |
Pager#getNextPage() | integer | 次のページNo |
Pager#getLastPage() | integer | 最後のページNo(ページ数) |
ベースURLがうまくいかない
urlMaskを設定する。
インスタンス後はaddUrlMask()による追加しかできないので、なるべくインタンスで決める。
どうしてもの時は、インタンス時に固定部分のみ宣言する*1
また、サンプル通りに{%page_number}を指定すると、/foo/barなURLの場合/foo/page_numberとなってしまう。
単純に相対パスで計算されてしまうから起こるものなので、/foo/bar/:page*2のようにして回避するか、generateUrl()などを使って、urlMaskに強引に設定する。
<?php $url = $this->generateUrl('route_name'); $layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), "{$url}/{%page_number}" );
リンクURLに動的なパラメータが必要
先程のurlMaskに強引に設定する方法でもいける。
他の方法としてdisplay()にパラメータを渡すことで実現できる。
パラメータが適用できる範囲は、urlMaskとsetTemplate()で指定する書式内
urlMaskはsetTemplate()内では{%url}として扱われる。
$layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), "{%foo}" ); $layout->setTemplate('<a href="{%url}/{%bar}/{%page_number}">{%page_number}</a>'); $layout->display(array('foo' => 'hoge', 'bar' => 'fuga')); #=> <a href="hoge/bar/1">1</a><a href="hoge/bar/2">2</a>...
ナンバーリンク1つ毎に違うパラメータが必要
Rangeを使って、foreachしてやるしかない