<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>digital matter &#187; doctrine</title>
	<atom:link href="http://blog.loadlimits.info/tag/doctrine/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loadlimits.info</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:27:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>DoctrineMongoDBBundleでAbstractDoctrineExtensionのエラー</title>
		<link>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/</link>
		<comments>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 07:43:32 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/</guid>
		<description><![CDATA[PHP Fatal error:&#160; Class &#8216;Symfony\\Bridge\\Doctrine\\DependencyInjection\\AbstractDoctrineExtension&#8217; not found in /home/path/to/Symfony/vendor/bundles/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php on line 31 php &#8211; DoctrineMongoDBBundle getting a fatal error in Symfony2 &#8211; Stack Overflow masterリポジトリが書き換えられていて、最新バージョンでは動かないのでdepsファイルにDoctrineMongoDBBundleのレポジトリを指定するときに、バージョン番号を指定する必要があるということでした。 DoctrineMongoDBBundleセクションにversion=v2.0.0を追加すればOKです。 [doctrine-mongodb] git=http://github.com/doctrine/mongodb.git [doctrine-mongodb-odm] git=http://github.com/doctrine/mongodb-odm.git [DoctrineMongoDBBundle] git=http://github.com/symfony/DoctrineMongoDBBundle.git target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle version=v2.0.0]]></description>
			<content:encoded><![CDATA[<p>PHP Fatal error:&#160; Class &#8216;Symfony\\Bridge\\Doctrine\\DependencyInjection\\AbstractDoctrineExtension&#8217; not found in /home/path/to/Symfony/vendor/bundles/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php on line 31</p>
<p><a href="http://stackoverflow.com/questions/7985248/doctrinemongodbbundle-getting-a-fatal-error-in-symfony2" target="_blank">php &#8211; DoctrineMongoDBBundle getting a fatal error in Symfony2 &#8211; Stack Overflow</a></p>
<p>masterリポジトリが書き換えられていて、最新バージョンでは動かないのでdepsファイルにDoctrineMongoDBBundleのレポジトリを指定するときに、バージョン番号を指定する必要があるということでした。   <br />DoctrineMongoDBBundleセクションにversion=v2.0.0を追加すればOKです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>[doctrine-mongodb]
    git=http://github.com/doctrine/mongodb.git

[doctrine-mongodb-odm]
    git=http://github.com/doctrine/mongodb-odm.git

[DoctrineMongoDBBundle]
    git=http://github.com/symfony/DoctrineMongoDBBundle.git
    target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle
    version=v2.0.0
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfonyでembed18nを使う</title>
		<link>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 15:30:09 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/</guid>
		<description><![CDATA[Symfonyで多言語対応する予定があるけど、とりあえず日本語だけ使いたかったときのメモです。embedI18nを自在に使う参考に。例によってSymfony 1.4+Doctrine。 // HogeForm.class.php public HogeForm extends BaseHogeForm { public function configure() { parent::configure(); $this-&#62;embedI18n(array('ja')); // 二次元配列でembedしたフォームにアクセスできる $this-&#62;validatorSchema['ja']['name']-&#62;setOption('required', true); $this-&#62;useFields(array('ja', 'foo', 'bar')); } } このままテンプレートで$form-&#62;render()とかしてしまうと、入れ子表示になってしまうのでrenderRowでそれぞれ表示するようにしてやれば、useFieldsでembedされたフォームの順番がいじれないという問題も解決。 // hogeCreateSuccess.php $form['ja']['name']-&#62;renderRow(); $form['foo']-&#62;renderRow(); $form['bar']-&#62;renderRow(); ちなみにsfFormDoctrine::getI18nFormClass()とかあるのですが、クラス名が取れるだけです。 追記 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry &#8217;19-ja&#8217; for key &#8216;PRIMARY&#8217; フォームをsaveしたら上記のエラーが出ました。 updateObject後にobject-&#62;toArray()をすると見覚えのない、「ja_JP」というキーが。 Array ( [id] =&#62; [foo] =&#62; hoge [bar] =&#62; moge [...]]]></description>
			<content:encoded><![CDATA[<p>Symfonyで多言語対応する予定があるけど、とりあえず日本語だけ使いたかったときのメモです。embedI18nを自在に使う参考に。例によってSymfony 1.4+Doctrine。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>// HogeForm.class.php
public HogeForm extends BaseHogeForm
{

    public function configure()
    {
        parent::configure();

        $this-&gt;embedI18n(array('ja'));

        // 二次元配列でembedしたフォームにアクセスできる
        $this-&gt;validatorSchema['ja']['name']-&gt;setOption('required', true);

        $this-&gt;useFields(array('ja', 'foo', 'bar'));
    }

}
</pre>
</div>
<p>このままテンプレートで$form-&gt;render()とかしてしまうと、入れ子表示になってしまうのでrenderRowでそれぞれ表示するようにしてやれば、useFieldsでembedされたフォームの順番がいじれないという問題も解決。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>// hogeCreateSuccess.php
$form['ja']['name']-&gt;renderRow();
$form['foo']-&gt;renderRow();
$form['bar']-&gt;renderRow();
</pre>
</div>
<p>ちなみにsfFormDoctrine::getI18nFormClass()とかあるのですが、クラス名が取れるだけです。</p>
<h3>追記</h3>
<blockquote>
<p>SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry &#8217;19-ja&#8217; for key &#8216;PRIMARY&#8217;</p>
</blockquote>
<p>フォームをsaveしたら上記のエラーが出ました。</p>
<p>updateObject後にobject-&gt;toArray()をすると見覚えのない、「ja_JP」というキーが。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>Array
(
    [id] =&gt;
    [foo] =&gt; hoge
    [bar] =&gt; moge
    [Translation] =&gt; Array
        (
            [ja] =&gt; Array
                (
                    [id] =&gt;
                    [name] =&gt; someone
                    [lang] =&gt; ja
                )
            [ja_JP] =&gt; Array
                (
                    [id] =&gt;
                    [name] =&gt;
                    [lang] =&gt; ja_JP
                )
        )
)
</pre>
</div>
<p>色々調べた結果、原因は</p>
<ul>
<li>langがchar(2)なので、jaとja_JPの区別がつかないこと</li>
<li>sfDoctrineRecord::getDefaultCulture()がja_JPなこと</li>
</ul>
<p>恐らく、<br />
  <br /><a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/19">http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/19</a></p>
<p>このページを参考にしているとハマるのではないかと…</p>
<p>ちなみにlangがchar(2)なのは、Doctrine_I18nの中で定義されています。</p>
<p>対策として考えられるのは以下のパターン。</p>
<ul>
<li>sfDoctrineRecord::setDefaultCulture(&#8216;ja&#8217;)をコールする</li>
<li>langをchar(5)にしてja_JPの形式で扱う</li>
<li>settings.ymlのdefault_cultureをjaにする</li>
<li>embedI18nにja_JPを渡す</li>
</ul>
<p>sfDoctrineRecordのカルチャをセットするのは、sfUserのカルチャをセットすることでイベントが駆動して同時にセットできます。なので、$this-&gt;getUser()-&gt;setCulture(‘ja’)とかしておけばOK。</p>
<p>langをchar(5)にするのは、I18nビヘイビアのオプションにlength:5を指定すればできます。この場合、カルチャをすべて５文字で扱うようにしないとlangがマッチしなくなります。length:2の場合は暗黙的に先頭２文字だけにマッチさせることで５文字のカルチャを許容していたので。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre># schema.yml
Sample:
  actAs:
    Timestampable: ~
    I18n:
      fields: [name]
      length: 5
</pre>
</div>
<p>settings.ymlのdefault_cultureをjaにするのが一番簡単です。en_USとen_GBはどうするんだという話ですけど…</p>
<p>formクラスに$this-&gt;embedI18n(array(‘ja_JP’))とすることでも対応できます。</p>
<p>気になる方はsfDoctrineRecordI18nFilterクラスのfilterSet関数を見てください。</p>
<p>カタログファイルとかにも影響しそうなのでsettings.ymlに２文字カルチャをセットするのがベターかなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyで行の並び順を指定できるビヘイビアを使ってみた</title>
		<link>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/</link>
		<comments>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 01:19:04 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/</guid>
		<description><![CDATA[今回はこちらを参考に、csDoctrineActAsSortablePluginを使ってみました。 $ ./symfony plugin:install csDoctrineActAsSortablePlugin &#62;&#62; plugin installing plugin "csDoctrineActAsSortablePlugin" &#62;&#62; sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ... &#62;&#62; sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz &#62;&#62; sfPearFrontendPlugin (6,795 bytes) &#62;&#62; sfPearFrontendPlugin . &#62;&#62; sfPearFrontendPlugin . &#62;&#62; sfPearFrontendPlugin ...done: 6,795 bytes &#62;&#62; sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin" &#62;&#62; sfSymfonyPluginManager Installing web data for plugin 使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。 ModelName: actAs: Timestampable: ~ [...]]]></description>
			<content:encoded><![CDATA[<p>今回は<a href="http://d.hatena.ne.jp/innx_hidenori/20100107/1262850227" target="_blank">こちら</a>を参考に、csDoctrineActAsSortablePluginを使ってみました。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$ ./symfony plugin:install csDoctrineActAsSortablePlugin
&gt;&gt; plugin    installing plugin "csDoctrineActAsSortablePlugin"
&gt;&gt; sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ...
&gt;&gt; sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz
&gt;&gt; sfPearFrontendPlugin (6,795 bytes)
&gt;&gt; sfPearFrontendPlugin .
&gt;&gt; sfPearFrontendPlugin .
&gt;&gt; sfPearFrontendPlugin ...done: 6,795 bytes
&gt;&gt; sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin"
&gt;&gt; sfSymfonyPluginManager Installing web data for plugin</pre>
</div>
<p>使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>ModelName:
  actAs:
    Timestampable: ~
    Sortable: ~</pre>
</div>
<p>これで、自動的にpositionというbigintのカラムが生成されて、ソート順が数字で指定できるようになります。</p>
<p>併せて順序を入れ替えるための便利なメソッドが使えるようになります。<br />
  <br /><a href="http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme" target="_blank">http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme</a></p>
<p>今回、I18nの下にSortableを置いたら、インデックス名がやたら長くなってしまい、CREATE文でエラーが出るようになってしまいました。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name '******_*********_***_*******_******_*****_translation_position_sortable_idx' is too long.</pre>
</div>
<p>plugins/csDoctrineActAsSortablePlugin/lib/template/Sortable.php</p>
<p><div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>  protected function getSortableIndexName()
  {
    return sprintf('%s_%s_%s', $this-&gt;getTable()-&gt;getTableName(), $this-&gt;_options['name'], $this-&gt;_options['indexName']);
  }</pre>
</div>
<p>ということなので、nameとindexNameを指定して短くできそうです。<br />
  <br />と言ってもposition_sortable分しか短くできないのですけど。</p>
<p>最終的には、schema.ymlの方でtableNameをdatabase_name.table_nameで指定していたのですが、これをtableName: table_nameにするだけで対応できました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Workbenchからschema.ymlを生成する</title>
		<link>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 20:18:26 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら@hidenorigotoさんに教えていただいたので試してみました。 http://twitter.com/#!/hidenorigoto/status/38153994970988544 MySQL Workbench schema exporter MySQL Workbench schema exporterは、MySQL WorkbenchプラグインのMySQL Workbench Doctrine Pluginにインスパイアを受けて開発されたようです。 が、こちらのプラグインはすでにメンテされていないようです。 開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。 MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。 ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。 注意点としてPHP 5.3以降でないと実行できません… いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。 まずはexampleディレクトリに移動します。 C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&#62;php -v PHP 5.3.5 (cli) (built: Jan 5 2011 20:36:18) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies example/data/にtest.mwbがあり、サンプルではこのファイルを使います。 ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら<a href="http://twitter.com/#!/hidenorigoto" target="_blank">@hidenorigotoさん</a>に教えていただいたので試してみました。     <br /><a href="http://twitter.com/#!/hidenorigoto/status/38153994970988544" target="_blank">http://twitter.com/#!/hidenorigoto/status/38153994970988544</a></p>
<p><a href="https://github.com/johmue/mysql-workbench-schema-exporter" target="_blank">MySQL Workbench schema exporter</a></p>
<p>MySQL Workbench schema exporterは、MySQL Workbenchプラグインの<a href="http://code.google.com/p/mysql-workbench-doctrine-plugin/" target="_blank">MySQL Workbench Doctrine Plugin</a>にインスパイアを受けて開発されたようです。     <br />が、こちらのプラグインはすでにメンテされていないようです。</p>
<p>開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。</p>
<p>MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。    <br />ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。</p>
<p>注意点としてPHP 5.3以降でないと実行できません…    <br />いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。</p>
<p>まずはexampleディレクトリに移動します。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php -v
PHP 5.3.5 (cli) (built: Jan  5 2011 20:36:18)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies</pre>
</div>
<p>example/data/にtest.mwbがあり、サンプルではこのファイルを使います。</p>
<p>ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2011/02/test.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="test.mwb" src="http://blog.loadlimits.info/wp-content/uploads/2011/02/test_thumb.png" width="423" height="326" /></a></p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php .\doctrine1.yaml.php
&lt;textarea cols="100" rows="50"&gt;Bureau:
  tableName: mydb.bureaus
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    room:
      type: string(45)
  indexes:
    testIndex:
      fields: [room]
      type: unique
  options:
    charset: utf8
    type: InnoDB

Email:
  actAs:
    timestampable:
  tableName: mydb.emails
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    email:
      type: string(255)
    users_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: Emails
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_Emails_Users:
      fields: [users_id]
  options:
    charset: utf8
    type: InnoDB

User:
  actAs:
    timestampable:
  tableName: mydb.users
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    name:
      type: string(255)
  options:
    charset: utf8
    type: InnoDB

UsersBureaus:
  tableName: mydb.users_bureaus
  columns:
    users_id:
      type: integer(4)
      primary: true
      notnull: true
    bureaus_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
    Bureau:
      class: Bureau
      local: bureaus_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_users_bureaus_bureaus1:
      fields: [bureaus_id]
  options:
    charset: utf8
    type: InnoDB

Testtable:
  tableName: mydb2.testtable
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
  options:
    charset: utf8
    type: InnoDB
&lt;/textarea&gt;&lt;br&gt;&lt;br&gt;1 MB used&lt;br&gt;0.055 sec needed</pre>
</div>
<p>というわけで、リレーションやインデックスなども書きだされるようです。<br />
  <br />HTMLのタグはdoctrine1.yaml.phpの中に書いてあるので、CLIから使うときは適当に外してください。</p>
<p>timestampableなどのビヘイビアに関しては、コメント欄に書くことで出力できるようです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>{d:actAs}
  actAs:
    timestampable:
{/d:actAs}</pre>
</div>
<p>この仕様はちょっと微妙な気が…<br />
  <br />created_atとupdated_atがあったらtimestampable付けるとかの方が楽だなぁ、と。 </p>
<p>作っちゃった後の全テーブルにコメント指定して回るのはちょっと辛いので。</p>
<p>サーバにPHP 5.3が入っているなら、symfony taskでmwbからschema.ymlの生成と、ActAsの追加をやってしまうのがいいかな、と思いました。</p>
<p>うーん、個人的にはMySQL Workbench上で完結したいから、プラグインの方が便利な気はするんですけどねぇ。LUAとは言わなくてもPythonスクリプティング対応しているようなので、Pythonに書き直すとか…</p>
<p>この後、60テーブルほどのファイルを変換してみましたが、問題なく実行できました。<br />
  </p>
<h3>追記(2011/02/19)</h3>
<p>注意点がいくつかあります。<br />
  <br />というか、致命的かも。</p>
<p>１．NOT NULLのchar型にDEFAULT値&#8221;を入れるとNULLに変換される</p>
<p>これはDoctrineのbuild &#8211;sqlがおかしいかな…</p>
<p>column_name:<br />
  <br />&#160; type: char(3)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8221;</p>
<p>column_name char(3) DEFAULT NULL NOT NULLとかいう矛盾を持ったクエリが生成されます。<br />
  <br />ちなみにvarcharは大丈夫です。</p>
<p>default: &#8221;の行は削除しましょう。</p>
<p>２．DECIMALやFLOATの最大桁数と少数点の値が逆になる</p>
<p>ひどい。<br />
  <br />例えばMySQL WorkbenchでDECIMAL(15,4)と指定したカラムがDECIMAL(4,15)と書き出されます。</p>
<p>column_name:<br />
  <br />&#160; type: decimal(4,15)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8217;0.0000&#8242;</p>
<p>もちろん、ちゃんとMySQL Workbenchからクエリのエクスポートをしたときは15,4になります。<br />
  <br />置換で何とか…</p>
<p>うーん、やっぱりMySQL WorkbenchでDBをあらかじめ作成しておいてから→doctrine:build-schema→schema.yml修正が妥当かなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>admin generatorの編集後のリダイレクト先変更</title>
		<link>http://blog.loadlimits.info/2010/05/admin-generator%e3%81%ae%e7%b7%a8%e9%9b%86%e5%be%8c%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e5%85%88%e5%a4%89%e6%9b%b4/</link>
		<comments>http://blog.loadlimits.info/2010/05/admin-generator%e3%81%ae%e7%b7%a8%e9%9b%86%e5%be%8c%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e5%85%88%e5%a4%89%e6%9b%b4/#comments</comments>
		<pubDate>Wed, 19 May 2010 04:31:06 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[admin generator]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/05/admin-generator%e3%81%ae%e7%b7%a8%e9%9b%86%e5%be%8c%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e5%85%88%e5%a4%89%e6%9b%b4/</guid>
		<description><![CDATA[admin generatorのeditアクションで、編集後に再度編集画面ではなく、リストに飛ばしたい要件があったのでメモ。例によってSymfony 1.4+Doctrine+admin generator。 class hogeActions extends autoHogeActions { public function executeUpdate(sfWebRequest $request) { $this-&#62;forward404Unless($request-&#62;isMethod('put')); $this-&#62;hoge = $this-&#62;getRoute()-&#62;getObject(); $this-&#62;form = $this-&#62;configuration-&#62;getForm($this-&#62;hoge); if ($this-&#62;form-&#62;bindAndSave($request-&#62;getParameter($this-&#62;form-&#62;getName()), $request-&#62;getFiles($this-&#62;form-&#62;getName()))) { $this-&#62;redirect('hoge'); } $this-&#62;setTemplate('edit'); } } executeUpdateをオーバーライドすればOKのようです。ここではisMethodがputなことに注意。]]></description>
			<content:encoded><![CDATA[<p>admin generatorのeditアクションで、編集後に再度編集画面ではなく、リストに飛ばしたい要件があったのでメモ。例によってSymfony 1.4+Doctrine+admin generator。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>class hogeActions extends autoHogeActions
{
    public function executeUpdate(sfWebRequest $request)
    {
        $this-&gt;forward404Unless($request-&gt;isMethod('put'));

        $this-&gt;hoge = $this-&gt;getRoute()-&gt;getObject();
        $this-&gt;form = $this-&gt;configuration-&gt;getForm($this-&gt;hoge);

        if ($this-&gt;form-&gt;bindAndSave($request-&gt;getParameter($this-&gt;form-&gt;getName()), $request-&gt;getFiles($this-&gt;form-&gt;getName()))) {
            $this-&gt;redirect('hoge');
        }

        $this-&gt;setTemplate('edit');
    }
}
</pre>
</div>
<p>executeUpdateをオーバーライドすればOKのようです。ここではisMethodがputなことに注意。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/05/admin-generator%e3%81%ae%e7%b7%a8%e9%9b%86%e5%be%8c%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88%e5%85%88%e5%a4%89%e6%9b%b4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfonyでのsave時に独自の処理を挟む</title>
		<link>http://blog.loadlimits.info/2010/05/symfony%e3%81%a7%e3%81%aesave%e6%99%82%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e5%87%a6%e7%90%86%e3%82%92%e6%8c%9f%e3%82%80/</link>
		<comments>http://blog.loadlimits.info/2010/05/symfony%e3%81%a7%e3%81%aesave%e6%99%82%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e5%87%a6%e7%90%86%e3%82%92%e6%8c%9f%e3%82%80/#comments</comments>
		<pubDate>Wed, 19 May 2010 02:12:16 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[admin generator]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/05/symfony%e3%81%a7%e3%81%aesave%e6%99%82%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e5%87%a6%e7%90%86%e3%82%92%e6%8c%9f%e3%82%80/</guid>
		<description><![CDATA[Symfony 1.4+Doctrineで、admin generatorな環境です。editなど、自動生成なので、どこをオーバーライドすれば目的の動作になるのかわかりにくいことがありますね。 例えば、あるモデルのステータスを変更すると同時に、他のモデルに対しても操作したい場合があるとします。 まぁ、mergeFormとかembedFormとか使ってもいいのですが、今回は他テーブルのプライマリキーをフォームから選択させたかったので、汎用性のあるdoSaveでの処理を追加してみました。 symfony Forms in Action &#124; 第11章 &#8211; Doctrine との統合 &#124; symfony &#124; Web PHP Framework class BackendHogeForm extends HogeForm { public function configure() { parent::configure(); // 使用するフィールドを指定 $this-&#62;useFields(array('status')); // 別モデルのIDリストを選択するフォームを作成する $choices = array(100 =&#62; '100:value1', 101 =&#62; '101:value2'); $this-&#62;widgetSchema['other_model_id'] = new sfWidgetFormSelect(array('choices' =&#62; $choices)); $this-&#62;validatorSchema['other_model_id'] = new sfValidatorChoice(array('choices' =&#62; array_keys($choices))); [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony 1.4+Doctrineで、admin generatorな環境です。editなど、自動生成なので、どこをオーバーライドすれば目的の動作になるのかわかりにくいことがありますね。</p>
<p>例えば、あるモデルのステータスを変更すると同時に、他のモデルに対しても操作したい場合があるとします。</p>
<p>まぁ、mergeFormとかembedFormとか使ってもいいのですが、今回は他テーブルのプライマリキーをフォームから選択させたかったので、汎用性のあるdoSaveでの処理を追加してみました。</p>
<p><a href="http://www.symfony-project.org/forms/1_2/ja/11-Doctrine-Integration" target="_blank">symfony Forms in Action | 第11章 &#8211; Doctrine との統合 | symfony | Web PHP Framework</a></p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>class BackendHogeForm extends HogeForm
{
    public function configure()
    {
        parent::configure();

        // 使用するフィールドを指定
        $this-&gt;useFields(array('status'));

        // 別モデルのIDリストを選択するフォームを作成する
        $choices = array(100 =&gt; '100:value1', 101 =&gt; '101:value2');
        $this-&gt;widgetSchema['other_model_id'] = new sfWidgetFormSelect(array('choices' =&gt; $choices));
        $this-&gt;validatorSchema['other_model_id'] = new sfValidatorChoice(array('choices' =&gt; array_keys($choices)));
    }

    protected function doSave($con = null)
    {
        if ($this-&gt;getValue('status') == 'DONE') {
            Doctrine::getTable('OtherModel')-&gt;find($this-&gt;getValue('other_model_id'))
                -&gt;setIsSelected(TRUE)
                -&gt;save();
        }
        return parent::doSave($con);
    }
}
</pre>
</div>
<p>基本的にはdoSaveをオーバーライドするだけです。ちなみにuseFieldsメソッドを使うと必要なフィールド以外を全部unsetしてくれるので便利です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/05/symfony%e3%81%a7%e3%81%aesave%e6%99%82%e3%81%ab%e7%8b%ac%e8%87%aa%e3%81%ae%e5%87%a6%e7%90%86%e3%82%92%e6%8c%9f%e3%82%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPのDateTimeの結果が-0001-11-30 00:00:00になる現象について</title>
		<link>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/</link>
		<comments>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/#comments</comments>
		<pubDate>Fri, 14 May 2010 10:04:33 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[疑問]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/</guid>
		<description><![CDATA[mySQLなどで、日時を0000-00-00 00:00:00としてデータベースに格納しておくことがありますが、これを読み込んでそのままPHPのDateTimeオブジェクトに渡すと、出力が-0001-11-30 00:00:00になってしまいます。 $a = new DateTime('0000-00-00 00:00:00'); echo $a-&#62;format('Y-m-d H:i:s'); // Output: -0001-11-30 00:00:00 PHP :: Bug #42971 :: DataTime::format(): not well formated data &#8217;0000-00-00 00:00:00&#8242; で、これはバグではないと言われているので、どういうことかと考えてみると、0000-00-00は存在しない0月0日を指定しているので、0月は繰り下がって-1年12月0日、さらに0日も繰り下がって-1年11月30日、となるわけですね。 データベースとPHPの文化の違い、というところでしょうか。 ちなみにDateTime型、コンストラクタにNULLを渡すと現在時刻のインスタンスが生成されるので、データベースの値をNULLにしておくと、現在時刻になってしまいます。うーん…symfonyのDoctrineでNULL判定したい場合はどうすればいいんだ… $row-&#62;getDateTimeObject('deleted_at') みたいなことがやりたいのですが。 sfDoctrineRecordも $type = $this-&#62;getTable()-&#62;getTypeOf($dateFieldName); if ($type == 'date' &#124;&#124; $type == 'timestamp') { return new DateTime($this-&#62;get($dateFieldName)); } こうなってるからオーバーライドするしかないのかな。]]></description>
			<content:encoded><![CDATA[<p>mySQLなどで、日時を0000-00-00 00:00:00としてデータベースに格納しておくことがありますが、これを読み込んでそのままPHPのDateTimeオブジェクトに渡すと、出力が-0001-11-30 00:00:00になってしまいます。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$a = new DateTime('0000-00-00 00:00:00');
echo $a-&gt;format('Y-m-d H:i:s');
// Output: -0001-11-30 00:00:00
</pre>
</div>
<p><a href="http://bugs.php.net/bug.php?id=42971" target="_blank">PHP :: Bug #42971 :: DataTime::format(): not well formated data &#8217;0000-00-00 00:00:00&#8242;</a></p>
<p>で、これはバグではないと言われているので、どういうことかと考えてみると、0000-00-00は存在しない0月0日を指定しているので、0月は繰り下がって-1年12月0日、さらに0日も繰り下がって-1年11月30日、となるわけですね。</p>
<p>データベースとPHPの文化の違い、というところでしょうか。</p>
<p>ちなみにDateTime型、コンストラクタにNULLを渡すと現在時刻のインスタンスが生成されるので、データベースの値をNULLにしておくと、現在時刻になってしまいます。うーん…symfonyのDoctrineでNULL判定したい場合はどうすればいいんだ…</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$row-&gt;getDateTimeObject('deleted_at')</pre>
</div>
<p>みたいなことがやりたいのですが。</p>
<p>sfDoctrineRecordも</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>    $type = $this-&gt;getTable()-&gt;getTypeOf($dateFieldName);
    if ($type == 'date' || $type == 'timestamp')
    {
      return new DateTime($this-&gt;get($dateFieldName));
    }
</pre>
</div>
</p>
<p>こうなってるからオーバーライドするしかないのかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doctrine_Collectionをループする</title>
		<link>http://blog.loadlimits.info/2010/02/doctrine_collection%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2010/02/doctrine_collection%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 04:12:52 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/02/doctrine_collection%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[Symfony 1.4+Doctrine やたら不便（だと個人的には思っている）なDoctrineの、SELECTに関するメモ。 やりたかったことは、ある条件で抽出した複数行に１行ずつ処理を加えて書き戻すというフロー。 fetchArray()とかでは配列しか返ってこないので意味がなく、fetchOne()では先頭行しか返ってこない。 fetchOne()を複数回実行すればいいのかと思ったら無限ループに陥った。 findByではorderByをするのにフックを使わないといけないらしいのでパス。 一応、以下の方法で解決しました。 $collection = Doctrine_Query::create() -&#62;select('u.*') -&#62;from('Users u') -&#62;where('u.flag = ?', '1') -&#62;orderBy('u.id') -&#62;execute(); var_dump(get_class($collection)); // Doctrine_Collection $iter = $collection-&#62;getIterator(); var_dump(get_class($iter)); // ArrayIterator while ($record = $iter-&#62;current()) { var_dump(get_class($record)); // Users var_dump($record-&#62;getId()); $iter-&#62;next(); } next()呼ばないといけないのは面倒だなと思ったら、foreachで使えたらしい。 $collection = Doctrine_Query::create() -&#62;select('u.*') -&#62;from('Users u') -&#62;where('u.flag = ?', '1') -&#62;orderBy('u.id') -&#62;execute(); var_dump(get_class($collection)); // [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony 1.4+Doctrine    <br />やたら不便（だと個人的には思っている）なDoctrineの、SELECTに関するメモ。 </p>
<p>やりたかったことは、ある条件で抽出した複数行に１行ずつ処理を加えて書き戻すというフロー。    <br />fetchArray()とかでは配列しか返ってこないので意味がなく、fetchOne()では先頭行しか返ってこない。     <br />fetchOne()を複数回実行すればいいのかと思ったら無限ループに陥った。 </p>
<p>findByではorderByをするのにフックを使わないといけないらしいのでパス。 </p>
<p>一応、以下の方法で解決しました。</p>
</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$collection = Doctrine_Query::create()
    -&gt;select('u.*')
    -&gt;from('Users u')
    -&gt;where('u.flag = ?', '1')
    -&gt;orderBy('u.id')
    -&gt;execute();

var_dump(get_class($collection)); // Doctrine_Collection

$iter = $collection-&gt;getIterator();
var_dump(get_class($iter)); // ArrayIterator

while ($record = $iter-&gt;current()) {
    var_dump(get_class($record)); // Users
    var_dump($record-&gt;getId());
    $iter-&gt;next();
}
</pre>
</div>
<p>next()呼ばないといけないのは面倒だなと思ったら、foreachで使えたらしい。</p>
</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$collection = Doctrine_Query::create()
    -&gt;select('u.*')
    -&gt;from('Users u')
    -&gt;where('u.flag = ?', '1')
    -&gt;orderBy('u.id')
    -&gt;execute();

var_dump(get_class($collection)); // Doctrine_Collection

$iter = $collection-&gt;getIterator();
var_dump(get_class($iter)); // ArrayIterator

foreach ($iter as $record) {
    var_dump(get_class($record)); // Users
    var_dump($record-&gt;getId());
}
</pre>
</div>
<p>これでかなりマシになった。 </p>
<p>最終的にはこれで。</p>
</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$collection = Doctrine_Query::create()
    -&gt;select('u.*')
    -&gt;from('Users u')
    -&gt;where('u.flag = ?', '1')
    -&gt;orderBy('u.id')
    -&gt;execute();

var_dump(get_class($collection)); // Doctrine_Collection

foreach ($collection-&gt;getIterator() as $record) {
    var_dump(get_class($record)); // Users
    var_dump($record-&gt;getId());
}
</pre>
</div>
<p>あとはループ内で$record['data'] = &#8216;hoge&#8217;;$record-&gt;save();とかしておけばOK。</p>
<h3>追記：2010/03/30</h3>
<p>全然違った。もっと簡単にできました。getIterator不要でした。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>foreach ($collection as $record) {
    $record['data'] = 'hoge';
    $record-&gt;save();
}
</pre>
</div>
<p>慣れてくると意外と便利な気がしなくもないDoctrine。結合系と特に。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/02/doctrine_collection%e3%82%92%e3%83%ab%e3%83%bc%e3%83%97%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

