<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BoBlog</title>
    <link>http://blog.as-roma.com/BoBlog/</link>
    <description>BoBlogのversion0.2です</description>
    <language>ja</language>
    <generator>Nucleus CMS v3.24</generator>
    <copyright>blog.as-roma.com</copyright>
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://blog.as-roma.com/nucleus/nucleus2.gif</url>
      <title>BoBlog</title>
      <link>http://blog.as-roma.com/BoBlog/</link>
    </image>
    <item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1413</guid>
 <title><![CDATA[MobaSiF::Template＠YAPC::Asia 2009]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1413</link>
<description><![CDATA[本日、<a href="http://conferences.yapcasia.org/ya2009/">YAPC::Asia 2009</a>にて、<a href="http://search.cpan.org/~bobpp/MobaSiF-Template/">MobaSiF::Template</a> について発表してきました。<br />
<br />
<h3>発表内容について</h3>今回は、利用方法やベンチマークなどの視点で MobaSiF::Template を紹介しました。<br />
正直なところ、うりは "速さ" しかないと思っているので、そこを全面に押し出しました。また、なぜ速く処理できるのかといった、裏側についても説明しました。<br />
<br />
<h4>発表資料＠Slideshare</h4><div style="width:425px;text-align:left" id="__ss_1976407"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/bobpp/mobasiftemplate-introduction-1976407" title="MobaSiF::Template Introduction">MobaSiF::Template Introduction</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mobasiftemplateatyapc2009upload-090910001331-phpapp01&stripped_title=mobasiftemplate-introduction-1976407" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mobasiftemplateatyapc2009upload-090910001331-phpapp01&stripped_title=mobasiftemplate-introduction-1976407" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/bobpp">Tadashi Matsuda</a>.</div></div><br />
<h4>github/CPAN</h4>MobaSiF::Template は github / CPAN で開発および公開しています。<dl><dt>github</dt><dd><a href="http://github.com/bobpp/perl-MobaSiF-Template">http://github.com/bobpp/perl-MobaSiF-Template/tree</a><br />
ぜひ fork して開発に参加してください！</dd><dt>CPAN</dt><dd><a href="http://search.cpan.org/~bobpp/MobaSiF-Template/">http://search.cpan.org/~bobpp/MobaSiF-Template/</a><br />
間に合いました！w</dd></dl><br />
今後とも、MobaSiF::Template をよろしくおねがいします。]]></description>
 <category>Develop</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1413</comments>
 <pubDate>Fri, 11 Sep 2009 10:17:12 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1412</guid>
 <title><![CDATA[YAPC::Asia 2009 でお話しします]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1412</link>
<description><![CDATA[今週、2009/09/10,11 東京工業大学大岡山キャンパスで行われる <a href="http://conferences.yapcasia.org/ya2009/">YAPC::Asia 2009</a> の 9/10 のセッションで発表する事になりました。<br />
<br />
<a href="http://conferences.yapcasia.org/ya2009/talk/2223">「高速なテンプレートエンジン "MobaSiF::Template"」</a>と題して、2009/09/10 14:30〜 より 20min にわたって、社内利用フレームワークのテンプレートエンジン部分にスポットを当てて、ベンチマーク等でこのテンプレートエンジンのよさをお伝えできればと思います。<br />
<br />
いままで、YAPC::Asia に行った事がなく、初参加でいきなり発表という不思議な状態ではありますが、がんばろうと思いますので、このような内容に興味ご関心のある方は、是非会場まで足を運んでいただければと思います。<br />
よろしくおねがいします。]]></description>
 <category>Develop</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1412</comments>
 <pubDate>Sun, 6 Sep 2009 22:50:32 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1411</guid>
 <title><![CDATA[PHP勉強会でMobaSiFのこと話した]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1411</link>
<description><![CDATA[<a href="http://events.php.gr.jp/events/show/75">第42回PHP勉強会</a>でPerlフレームワークのMobaSiFについてしゃべってきました。<br />
<br />
<a href="http://d.hatena.ne.jp/sotarok/">sotarok</a>にそそのかされてのこのこ出てきたんですが、Perlの話しとかしていいんだろうか。<br />
という最大の疑問を抱えたまま、会場入り。<br />
<br />
そういえば、こういう外部に対して、技術ネタを発表するって初めてなので、緊張しまくりのまま発表しました。<br />
つくったものをプレゼンした事はあっても、基本的に学校内の話ですし、それでも結構緊張するのに、外部向けとか。。。みんなやさしくしてねー！みたいな。<br />
<br />
<h3>発表内容について</h3>今回、sotarokが言っていたのは「PHPerはほかの言語の世界も知るべき」ということで自分を呼んだとの事ですが、結果的にこういうフレームワークに対するアプローチもあるんだよというのを提示することに専念しました。<br />
コードとか出してもシンタックスの説明からしていたら、時間に収まらないので書けないですし、<br />
発表のネタ元のMobaSiFも今の「モダンPerl」的なフレームワークでもないので、"今の"Perlの世界を映す材料にもならないからです。<br />
<br />
もしこの発表で、フレームワーク開発やフレームワークに対する考え方が少しでも広がっていただけたら幸いです。<br />
<br />
<h4>ustream</h4><a href="http://www.ustream.tv/recorded/1433440">ここから発表を見る事も出来るらしいです！</a><br />
<br />
<h4>発表資料</h4><div style="width:425px;text-align:left" id="__ss_1351953"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/bobpp/42php-mobasif-1351953?type=powerpoint" title="第42回PHP勉強会 MobaSiF 発表資料">第42回PHP勉強会 MobaSiF 発表資料</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mobasifatphp42-090427104625-phpapp01&stripped_title=42php-mobasif-1351953" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mobasifatphp42-090427104625-phpapp01&stripped_title=42php-mobasif-1351953" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/bobpp">bobpp</a>.</div></div><br />
<br />
<h4>Ethnaを比較対象にした訳</h4>若干ネタバレですが、<br />
本当に慣れているからだけなのです。<br />
しかし、比較を始めてからもっとRails世代のフレームワークと比較すべきだったと後悔しています。<br />
これは、EthnaとMobaSiFって一部似ているところがあって、もっと違いすぎるフレームワークと比較した方がよかったなと思います。<br />
<br />
<h3>rhaco2</h3>どうみても変態。まずDjango触ってみてから触ってみたい。<br />
<h3>Ethna</h3>今回は不要に対決姿勢な面もありましたがw　やっぱり、いまだにPHPで何か書くならEthnaだと自分は思っているのでAppObjectは残してあげてくださいw<br />
<br />
とりあえず、発表してみた訳ですが、また何か発表してもいいなー、次はEthnaネタだな！]]></description>
 <category>Develop</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1411</comments>
 <pubDate>Tue, 28 Apr 2009 01:28:44 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1410</guid>
 <title><![CDATA[iPhone買ってみた]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1410</link>
<description><![CDATA[<a href="http://www.flickr.com/photos/bobpp/3455585377/" title="iPhone買うた by bobpp, on Flickr"><img src="http://farm4.static.flickr.com/3335/3455585377_961ae2afd3.jpg" width="500" height="375" alt="iPhone買うた" /></a><br />
つい勢いでiPhone買いました。<br />
<br />
なんか便利に使ってみていこうかなと思います。ただ、前のケータイはそのまま継続してもっているので、別に連絡先に変更はありません。]]></description>
 <category>Note</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1410</comments>
 <pubDate>Mon, 20 Apr 2009 02:05:43 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1409</guid>
 <title><![CDATA[EthnaでLayoutView]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1409</link>
<description><![CDATA[今週もEthnaネタを。<br />
ある人がすごくお待ちかねのネタだそうです。<br />
<br />
<h3>概要</h3>EthnaのViewをRailsとかにあるLayoutに対応させます。<br />
これは結構いろんな人がやっているようです。その一つということで。<br />
<br />
<h3>Source</h3><a href="http://bobpp.as-roma.com/svn/ethnaLibs/trunk/projBop_Layout_ViewClass.php">http://bobpp.as-roma.com/svn/ethnaLibs/trunk/projBop_Layout_ViewClass.php</a><br />
こちらになります。<br />
<br />
使い方は続きをみてね。<h3>How to Load</h3>libsディレクトリなどに置いてください。include_onceできればどこでもいいですが。<br />
2006年夏頃からのEthnaはプロジェクトジェネレート時にアプリケーション固有のViewClassを作成するので、それの基底クラスを変更することにします。<br />
<code class="codebeautifier">
<span class="reserved">require_once</span>&nbsp;<span class="string_literal">'libs/projBop_Layout_ViewClass.php'</span>;<br />
<span class="reserved">class</span>&nbsp;AppID_ViewClass&nbsp;<span class="reserved">extends</span>&nbsp;projBop_Layout_ViewClass&nbsp;{&nbsp;...&nbsp;}
</code>このようにしていけばいいかと思います。<br />
<br />
<h3>Layoutファイルの書き方</h3>レイアウトファイルも通常のテンプレートとあまり変わりません。<br />
1カ所、実際のコンテンツが入る箇所に<br />
<code class="codebeautifier">
{include&nbsp;file=$app.contents_tpl_path}
</code>と記述する必要があります。<br />
<br />
簡単にテンプレートを書くと、、、<br />
<code class="codebeautifier">
!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Strict//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;<br />
&lt;<span class="reserved">html</span>&nbsp;xmlns=<span class="string_literal">"http://www.w3.org/1999/xhtml"</span>&gt;<br />
&lt;<span class="reserved">head</span>&gt;<br />
&nbsp;&nbsp;&lt;<span class="reserved">title</span>&gt;Test!&lt;/<span class="reserved">title</span>&gt;<br />
&lt;/<span class="reserved">head</span>&gt;<br />
&lt;<span class="reserved">body</span>&gt;<br />
&nbsp;&nbsp;&lt;<span class="reserved">h1</span>&gt;Test&nbsp;Site!&lt;/<span class="reserved">h1</span>&gt;<br />
&nbsp;&nbsp;{include&nbsp;file=$app.contents_tpl_path}<br />
&lt;/<span class="reserved">body</span>&gt;<br />
&lt;/<span class="reserved">html</span>&gt;
</code>このような記述になります。<br />
<br />
<h3>Layoutの宣言</h3>Layoutの宣言は $_layout プロパティで行います。なので基本的なレイアウトがある場合は、<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_ViewClass&nbsp;<span class="reserved">extends</span>&nbsp;projBop_Layout_ViewClass&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$_layout</var>&nbsp;=&nbsp;<span class="string_literal">'application'</span>;<br />
&nbsp;<br />
&nbsp;&nbsp;...<br />
}
</code>と記述しておけばいいと思います。<br />
<br />
また、ViewClassの動作中にレイアウトを変更したい場合は setLayoutメソッドがありますのでそちらをご利用ください。<br />
<code class="codebeautifier">
<var>$this</var>-&gt;setLayout(<span class="string_literal">"hoge"</span>);
</code>このように利用します。<br />
<br />
また、レイアウトファイルの置き場所ですが、<strong>template/&lt;lang&gt;/layout</strong>がデフォルトです。<br />
変更したい場合は、 $_layout_dir プロパティまたは setLayoutDirectory メソッドを利用してください。<br />
<br />
言語に問わずレイアウトが統一の場合の例としては、<br />
<code class="codebeautifier">
<span class="code-comment">//&nbsp;Class定義で決める場合は</span><br />
<span class="reserved">class</span>&nbsp;AppID_ViewClass&nbsp;<span class="reserved">extends</span>&nbsp;projBop_Layout_ViewClass&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$_layout_dir</var>&nbsp;=&nbsp;<span class="string_literal">"template/layout"</span>;<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="code-comment">//&nbsp;動的に決定する場合などは</span><br />
<var>$this</var>-&gt;setLayoutDirectory(<span class="string_literal">"template/layout"</span>);
</code>このように変更することができます。<br />
<br />
<h3>Done.</h3>このようにレイアウトファイルとレイアウトの設定ができればレイアウトを取り込んで出力することになります。<br />
これで同じようなテンプレートのコピペが減ってよりDRYなシステムになるでしょう！<br />
<br />
感想・バグなどございましたらぜひコメント等でご連絡ください。]]></description>
 <category>Ethna</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1409</comments>
 <pubDate>Sat, 28 Feb 2009 18:13:00 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1408</guid>
 <title><![CDATA[デフォルトの強化]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1408</link>
<description><![CDATA[昨日公開した<a href="http://blog.as-roma.com/BoBlog/?itemid=1407">Ethna_AppObjectでHasMany</a>や、来週公開予定のライブラリの資料を書いてみて思うのだけど、昔書いたコードはデフォルト値の指定がまだまだ甘いなと感じる。<br />
もっと簡単に書けるように改修できそうな気がしてきたので、再来週はそれをやろうかな。]]></description>
 <category>Ethna</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1408</comments>
 <pubDate>Tue, 24 Feb 2009 01:57:21 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1407</guid>
 <title><![CDATA[AppObjectでHasManyとか]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1407</link>
<description><![CDATA[久々のEthnaネタです。<br />
まだいくつかネタがあることが判明しましたので、徐々に公開していこうと思います。<br />
<br />
AppObjectでRailsのActiveRecordでいうBelongsTo/HasOne/HasMany/HasAndBelongsToMany/HasManyThroughを実装してみました。<br />
HasManyThroughはすごく不完全のようです。<br />
AppObject再編が騒がれているこのタイミングというのも何かの縁でしょう。完全にその再編で思い出しただけなんですが。<br />
<br />
ただ、だいぶ昔のバージョンでしか試していないのが若干不安です、しかし一応世の中に出しているサービスで稼働中の実績もあります。<br />
この辺の名前は出していいのかわからないので、いったん自重しておきます。<br />
<br />
<h3>Source</h3>ついに、こういうライブラリもsvn管理になりました。<br />
<a href="http://bobpp.as-roma.com/svn/ethnaLibs/trunk/projBop_AppObject.php">http://bobpp.as-roma.com/svn/ethnaLibs/trunk/projBop_AppObject.php</a><br />
こちらになります。ほかの機能もいくつか混ざっているようですが、それは追って紹介していこうと思います。<br />
<br />
使い方は続きをどうぞ。<h3>How to Load.</h3>libsディレクトリなどに置いてください。include_onceできれば別にどこでもかまわないです。<br />
また、利用するすべてのAppObject/AppManagerをこのクラスのサブクラスにしてください。<br />
<br />
AppManager/AppObjectをフル活用しているエンジニアの大半は <i>&lt;AppID&gt;</i>_AppObjectや<i>&lt;AppID&gt;</i>_AppManagerを持っているという噂なので、そのアプリケーション固有の基底クラスをprojBop_AppObject, projBop_AppManagerに置き換えるだけです。<br />
<br />
ということで、ありがちな例としては、<br />
<code class="codebeautifier">
<span class="reserved">include_once</span>&nbsp;<span class="string_literal">'libs/projBop_AppObject.php'</span>;<br />
<span class="reserved">class</span>&nbsp;AppId_AppObject&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{&nbsp;...&nbsp;}<br />
<span class="reserved">class</span>&nbsp;AppId_AppManager&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppManager&nbsp;{&nbsp;...&nbsp;}
</code>このような形でしょうか。<br />
<br />
<h3>has_one/belongs_to</h3>早速has_one/belongs_toから。<br />
<br />
例として、「ユーザはプロフィールを持つ」という関係を書いてみようと思います。<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_one</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'profile'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Profile&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>このような宣言をする必要がありますが、Rails風の命名規則、外部キーはリレーション先のテーブル名_id の規則に則っていれば省略可能なので、上記の例は、<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_one</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'profile'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Profile&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>とすることもできます。この命名規則はここから先のすべての例について適用されます。<br />
<br />
<h4>get</h4>ではさっそく関連オブジェクトの取得を行ってみましょう。<br />
まずは、User#id=1のプロフィールオブジェクトを取得する例です。<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$profile</var>&nbsp;=&nbsp;<var>$user</var>-&gt;profile-&gt;get();
</code>このようにすればOKです。「profile」はリレーションの定義に用いたキー名をそのまま利用しています。<br />
そのgetメソッドで関連オブジェクトが取得できます。<br />
<br />
では、Profileからユーザを取得する場合は？<br />
<code class="codebeautifier">
<var>$profile</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Profile'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$user</var>&nbsp;=&nbsp;<var>$profile</var>-&gt;user-&gt;get();
</code>これだけです。非常に簡単ですね。<br />
<br />
<h4>set</h4>取得できたら保存も。<br />
<code class="codebeautifier">
<var>$profile</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Profile'</span>);<br />
<var>$profile</var>-&gt;set(<span class="string_literal">'description'</span>,&nbsp;<span class="string_literal">'Ethna-AppObject-Relations'</span>);<br />
<br />
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$user</var>-&gt;profile-&gt;set(<var>$profile</var>);
</code>これで $profileのuser_id は1として保存されます。また、$profileの保存も自動的に行います。<br />
<br />
こちらも逆にProfileからUserをセットする場合は？<br />
<code class="codebeautifier">
<var>$profile</var>-&gt;user-&gt;set(<var>$user</var>);
</code>このようにかわるだけです。自動的な保存も同様に行われます。<br />
<br />
<h3>has_many/belongs_to</h3>続いてHasMany/BelongsTo。<br />
<br />
今回は、「ユーザの出身都道府県」という関係を。まずは定義から。<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_Pref&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'pref_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'pref'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'pref_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>このようになります。先の命名規則による省略を用いると、<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_Pref&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'pref'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>このように省略できます。<br />
<br />
<h4>get/getsAll</h4>ある都道府県にいる人全員を取得してみましょう。<br />
<code class="codebeautifier">
<var>$pref</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Pref'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$users</var>&nbsp;=&nbsp;<var>$pref</var>-&gt;user-&gt;getAll();
</code>たったこれだけです。Pref#id=1にいるUser#id=2だけを取得する際は、<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;<var>$pref</var>-&gt;user-&gt;get(2);
</code>こうなります。<br />
<br />
逆に、User#id=2の都道府県を取得するには、<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;2);<br />
<var>$pref</var>&nbsp;=&nbsp;<var>$user</var>-&gt;pref-&gt;get();
</code>例によってこれだけです。<br />
<br />
<h4>find</h4>都道府県からみたユーザはたくさんありますが、条件を指定して検索をかけることもfindメソッドで可能です。<br />
今回は「性別が男 (gender = M) であるユーザを生年月日若い順(ORDER BY birthday ASC)に10件(LIMIT 10)」という検索条件を加えてみます。<br />
<br />
書き方としては、AppManager#getObjectListのfilter等と同じなので取っ付きやすいと思います。<br />
<code class="codebeautifier">
<var>$pref</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Pref'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$filter</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;<span class="string_literal">'gender'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'M'</span>,<br />
);<br />
<var>$order</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;<span class="string_literal">'birthday'</span>&nbsp;=&gt;&nbsp;OBJECT_SORT_ASC,<br />
);<br />
<var>$limit</var>&nbsp;=&nbsp;10;<br />
<var>$users</var>&nbsp;=&nbsp;<var>$pref</var>-&gt;user-&gt;find(<var>$filter</var>,&nbsp;<var>$order</var>,&nbsp;<var>$limit</var>);
</code>このようにすることで検索も容易に行えます。<br />
<br />
<h4>set</h4>保存をしてみましょう。<br />
新しく作ったユーザをPref#id=2に所属させてみましょう。<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>);<br />
<var>$user</var>-&gt;set(<span class="string_literal">'name'</span>,&nbsp;<span class="string_literal">'BoBpp'</span>);<br />
<br />
<var>$pref</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Pref'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;2);<br />
<var>$user</var>-&gt;pref-&gt;set(<var>$pref</var>);
</code>このようになります。$userは pref->set した時点で、外部キーの設定がされて自動的に保存されます。<br />
<br />
逆のやり方としては、<br />
<code class="codebeautifier">
<var>$pref</var>-&gt;user-&gt;set(<var>$user</var>);
</code>このようにかわるだけです。こちらも自動的に保存がされます。<br />
<br />
<h3>HasAndBelongsToMany</h3>HABTMにも対応します。<br />
<br />
「ユーザへのタグ付け」という例を。まずは、定義からですが、<br />
ユーザとタグの関係を表現するテーブルを tag_user テーブルとして、<ul><li>id</li><li>tag_id</li><li>user_id</li></ul>このようなテーブルだとします。<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_and_belongs_to_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'tag'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'tag_user'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'from_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'dest_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'tag_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Tag&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_and_belongs_to_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'tag_user'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'from_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'tag_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'dest_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>このようになります。<br />
relationはこの二つのリレーションを表すテーブルです。[id, user_id, tag_id]のみのテーブルとなります。<br />
from_keyはrelationテーブルのカラムの中で、自身の外部キーが入るカラム名を指定してください。<br />
dest_keyはrelationテーブルのカラムの中で、相手の外部キーが入るカラム名を指定してください。<br />
<br />
なお、上記三つも省略できます。from_key, dest_keyはBelongsTo,HasOne,HasManyのkeyと同じ命名規則です。<br />
relationは、二つのモデル名を比較して小さい方を前方に置いた、モデル名_モデル名 となります。<br />
よって、上の例も省略記法を用いると、<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_and_belongs_to_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'tag'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Tag&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_and_belongs_to_many</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}
</code>このように省略できます。<br />
<br />
<h4>get/getsAll</h4>使い方は基本的にHasManyの項目と同じですが、、、<br />
Tag#id=1がついたユーザ群を取得するには、<br />
<code class="codebeautifier">
<var>$tag</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Tag'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$users</var>&nbsp;=&nbsp;<var>$tag</var>-&gt;user-&gt;getAll();
</code>こうなります。<br />
Tag#id=1がついているUser#id=2を取得する場合は、<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;<var>$tag</var>-&gt;user-&gt;get(2);
</code>こう変わります。<br />
<br />
<h4>set</h4>保存もしてみましょう。<br />
User#id=1にTag#id=2をつけてみましょう。<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$tag</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Tag'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;2);<br />
<br />
<var>$user</var>-&gt;tag-&gt;set(<var>$tag</var>);
</code>このようにします。今回は$user,$tagともに保存済みであることが求められます。ここは要注意です。<br />
<br />
HasAndBelongsToManyにはfindがありません。いずれ実装されるのかもしれません。。。？<br />
<br />
<h3>HasManyThrough</h3>不完全ではありますが、一応あります。<br />
<br />
では、「ユーザは複数のグループに所属する」という関係を扱ってみましょう。まずは定義ですが、<br />
所属する関係をmembershipテーブルで表現し、<ul><li>id</li><li>user_id</li><li>group_id</li><li>joined_at</li><li>level</li></ul>このようなテーブルとします。<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_Group&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many_through</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'membership'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'from_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'group_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'dest_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many_through</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'group'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'membership'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'from_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'dest_key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'group_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Membership&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'group'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'group_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'key'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'user_id'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;...<br />
}
</code>こうなります。HasManyThroughの場合はrelationだけ省略不可です。そのため、省略を行うと、、、<br />
<code class="codebeautifier">
<span class="reserved">class</span>&nbsp;AppID_Group&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many_through</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'membership'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_User&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$has_many_through</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'group'</span>&nbsp;=&gt;&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'relation'</span>&nbsp;=&gt;&nbsp;<span class="string_literal">'membership'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;),<br />
&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;...<br />
}<br />
<br />
<span class="reserved">class</span>&nbsp;AppID_Membership&nbsp;<span class="reserved">extends</span>&nbsp;projBop_AppObject&nbsp;{<br />
&nbsp;&nbsp;<span class="reserved">var</span>&nbsp;<var>$belongs_to</var>&nbsp;=&nbsp;<span class="reserved">array</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'group'</span>&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="string_literal">'user'</span>&nbsp;&nbsp;=&gt;&nbsp;<span class="reserved">null</span>,<br />
&nbsp;&nbsp;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;...<br />
}
</code>このようになります。<br />
<br />
<h4>get/getsAll</h4>get/getsAllもちょっと特殊です。<br />
<br />
単純にUser#id=1が所属するグループを取得するだけであれば、<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$groups</var>&nbsp;=&nbsp;<var>$user</var>-&gt;group-&gt;getsAll();<br />
<var>$group</var>&nbsp;&nbsp;=&nbsp;<var>$user</var>-&gt;group-&gt;get(2);&nbsp;<span class="code-comment">//&nbsp;User#id=1が所属しているGroup#id=2を取得</span>
</code>とHABTMと同じように扱えるのですが、Relationのオブジェクト ここではMembershipも欲しい場合は、<br />
<code class="codebeautifier">
<var>$groups</var>&nbsp;=&nbsp;<var>$user</var>-&gt;group-&gt;getsAll(<span class="reserved">TRUE</span>);<br />
<span class="reserved">foreach</span>&nbsp;(<var>$groups</var>&nbsp;<span class="reserved">AS</span>&nbsp;<var>$g</var>)&nbsp;{<br />
&nbsp;&nbsp;<var>$membership</var>&nbsp;=&nbsp;<var>$g</var>-&gt;RelationObject;<br />
}<br />
<br />
<span class="code-comment">//&nbsp;Group#id=3だけの場合は、</span><br />
<var>$group</var>&nbsp;=&nbsp;<var>$user</var>-&gt;group-&gt;get(3,&nbsp;<span class="reserved">TRUE</span>);<br />
<var>$membership</var>&nbsp;=&nbsp;<var>$group</var>-&gt;RelationObject;
</code>と、get/getsAllの引数にTrueを追加するとリレーションのリレーションのオブジェクトを取得することができます。<br />
RelationObjectというプロパティ名は、現在は固定です。<br />
<br />
<h4>set</h4>では保存もしてみましょう。<br />
User#id=1をGroup#id=4に保存してみましょう。<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$group</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Group'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;4);<br />
<br />
<var>$user</var>-&gt;group-&gt;set(<var>$group</var>);
</code>これだけです。しかし、Membershipオブジェクトのjoined_at, levelもセットしたいですね。そんなときは、<br />
<code class="codebeautifier">
<var>$user</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_User'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;1);<br />
<var>$group</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Group'</span>,&nbsp;<span class="string_literal">'id'</span>,&nbsp;4);<br />
<var>$membership</var>&nbsp;=&nbsp;&amp;<var>$this</var>-&gt;backend-&gt;getObject(<span class="string_literal">'AppID_Membership'</span>);<br />
<var>$membership</var>-&gt;set(<span class="string_literal">'joined_at'</span>,&nbsp;<a href="http://www.php.net/time" class="builtin">time</a>());<br />
<var>$membership</var>-&gt;set(<span class="string_literal">'level'</span>,&nbsp;10);<br />
<br />
<var>$user</var>-&gt;group-&gt;set(<var>$group</var>,&nbsp;<var>$membership</var>);
</code>このようにsetの第2引数にリレーションオブジェクトを設定すれば同時に保存されます。<br />
<br />
<h3>最後に</h3>今回は、過去最大級のライブラリ？をこんなタイミングでリリースした訳ですが、AppObjectもこれくらいはできるぜ。<br />
これでAppObjectでサクサク開発していただければと思います。<br />
<br />
バグとかもしございましたら、ご連絡ください。<br />
]]></description>
 <category>Ethna</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1407</comments>
 <pubDate>Sun, 22 Feb 2009 22:33:50 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1405</guid>
 <title><![CDATA[開発合宿]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1405</link>
<description><![CDATA[<img src="http://blog.as-roma.com/media/2/20090208-P1030463.jpg" width="500" height="375" alt="合宿中" title="合宿中" /><br />
学生時代からやりたかった開発をついに！<br />
一通り動くものができたので、もうちょっと完成度あげて公開したいなー。]]></description>
 <category>Note</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1405</comments>
 <pubDate>Sun, 8 Feb 2009 21:37:26 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1404</guid>
 <title><![CDATA[ひさびさ＠Mac]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1404</link>
<description><![CDATA[かなり久々です。ご無沙汰しております。<br />
<br />
最近は仕事で開発するのがメインで、個人的な開発にあまり手を付けられておりません。<br />
ですが、学校の卒業制作で作ったシステムを豪快に作り直す企画と、学生時代からあたためてる？企画があるので、今年中にある程度形にできるように時間も取れていけたらなと考えている今日この頃です。<br />
両方Railsで作る予定なので、何かここに残せるようなネタは無い気がしていますが、何かあればぜひ書かせてください。<br />
<br />
<img src="http://blog.as-roma.com/media/2/20081127-P1030355.jpg" width="500" height="462" alt="MacBook" title="MacBook" /><br />
そういえば。<br />
MacBook買いました。会社支給のMacBook Airもあるので、一気にMacが2台になりました。<br />
<br />
あと、今週末にはPlaystation3とウイイレを買おうかなと考えております。<br />
ぜひ誰か対戦しましょう！！]]></description>
 <category>Note</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1404</comments>
 <pubDate>Thu, 27 Nov 2008 01:56:43 +0900</pubDate>
</item><item>
 <guid isPermaLink="true">http://blog.as-roma.com/BoBlog/index.php?itemid=1403</guid>
 <title><![CDATA[そういえば就職してました。]]></title>
 <link>http://blog.as-roma.com/BoBlog/?itemid=1403</link>
<description><![CDATA[ココに書かなかったので一応ご報告しておきます。<br />
<br />
表題どおり、4月1日より、新卒としてある会社に入社しました。<br />
ここまでやっといてPHP関連の会社ではありません。そういえばYAPC::Asia 2008のスポンサーだった気がします。<br />
<br />
今は技術者研修を受講していて、なんかモノを作っていたりしています。<br />
なので、YAPCには行けませんでした。今年は行くぞーって思ってたのでちょっと残念です。<br />
<br />
そんなわけで元気にやっていますので、ご安心ください。]]></description>
 <category>Note</category>
<comments>http://blog.as-roma.com/BoBlog/?itemid=1403</comments>
 <pubDate>Sun, 18 May 2008 04:17:15 +0900</pubDate>
</item>
  </channel>
</rss>