<?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>Groove Labo &#187; CakePHP</title>
	<atom:link href="http://labo.opengroove.com/blog/category/php/cakephp/feed/" rel="self" type="application/rss+xml" />
	<link>http://labo.opengroove.com/blog</link>
	<description>株式会社オープングルーヴの開発者のブログ</description>
	<lastBuildDate>Tue, 28 Sep 2010 06:09:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>CakePHP で連結テーブルのモデルは先に宣言すること</title>
		<link>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/</link>
		<comments>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 03:58:36 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=621</guid>
		<description><![CDATA[sugimoto です。最近、CakePHPを使ってます。 しばらくRails を使っていたこともあり、わかりやすい所もある反面、衝撃的に違うところがあったりして試行錯誤な毎日です。 先日、連結テーブルに「並び順」カラムを持たせて、hasManyAndBelongsToなリレーションの順番をつけようとしたところ、うまく動きませんでした。 プロジェクトとユーザーを以下のようなテーブルで関連つけていました projects users projects_users このとき、「各プロジェクトの参加者ごとに並び順を設定したい」という要望があり、 projects_users に position カラムを持たせて並び順を設定することにしました。 positionカラムの更新をするために ProjectsUser という中途半端なmodel クラスを作ったところ、問題発生。 projects_controller のuses 句で ProjectsUser を設定しているにもかかわらず、ProjectsUser の関数が呼べず、controller内での $this->ProjectsUser の実体がなぜか AppModel となっていました。 AppController など、ソースを確認したところ、controller のイニシャライズ時、以下のようなロジックでした。 Projectモデルのインスタンス を作成 Projectモデルで設定されているリレーションに該当するモデルのインスタンスを作成(Userなど) リレーションテーブルを扱うのインスタンス ProjectsUserを作成 その際、デフォルト実装である AppModel のインスタンスとして作成 上記作成したインスタンスはすべてキャッシュ ProjectsUserを作成するが、すでにキャッシュされているためそれを使用 つまり、上記処理がcontroller の uses句内で宣言された順に処理されているため、ProjectsUserをロードするとき、先に処理したProjectモデルのリレーションとして作成されたProjectsUserが優先されていたわけです。 今日の格言 リレーショナルテーブルのモデルを作ったら、uses 句内では必ず先に宣言すること。 ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone ソフトウェアエンジニアのためのバグトラッキングシステム]]></description>
			<content:encoded><![CDATA[<p>
sugimoto です。最近、CakePHPを使ってます。
</p>

<p>
しばらくRails を使っていたこともあり、わかりやすい所もある反面、衝撃的に違うところがあったりして試行錯誤な毎日です。
</p>

<p>
先日、連結テーブルに「並び順」カラムを持たせて、hasManyAndBelongsToなリレーションの順番をつけようとしたところ、うまく動きませんでした。
</p>

<p></p>
プロジェクトとユーザーを以下のようなテーブルで関連つけていました


<pre>
projects
users
projects_users
</pre>

<p>
このとき、「各プロジェクトの参加者ごとに並び順を設定したい」という要望があり、 projects_users に position カラムを持たせて並び順を設定することにしました。
</p>

<p>
positionカラムの更新をするために ProjectsUser という中途半端なmodel クラスを作ったところ、問題発生。
</p>

<p>
projects_controller のuses 句で ProjectsUser を設定しているにもかかわらず、ProjectsUser の関数が呼べず、controller内での $this->ProjectsUser の実体がなぜか AppModel となっていました。
</p>

<p>
AppController など、ソースを確認したところ、controller のイニシャライズ時、以下のようなロジックでした。
</p>

<ol>
  <li>Projectモデルのインスタンス を作成</li>
  <li>Projectモデルで設定されているリレーションに該当するモデルのインスタンスを作成(Userなど)</li>
  <li>リレーションテーブルを扱うのインスタンス ProjectsUserを作成</li>
  <li>その際、デフォルト実装である AppModel のインスタンスとして作成</li>
  <li>上記作成したインスタンスはすべてキャッシュ</li>
  <li>ProjectsUserを作成するが、すでにキャッシュされているためそれを使用</li>
</ol>

<p>
つまり、上記処理がcontroller の uses句内で宣言された順に処理されているため、ProjectsUserをロードするとき、先に処理したProjectモデルのリレーションとして作成されたProjectsUserが優先されていたわけです。
</p>

<h4>今日の格言</h4>

<p>
リレーショナルテーブルのモデルを作ったら、uses 句内では必ず先に宣言すること。
</p>

<h3><span style="color: #999999;">ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone</span></h3>

<p><a title="ソフトウェアエンジニアのためのバグトラッキングシステム" href="http://ciklone.com/"><img class="alignnone" title="ソフトウェアエンジニアのためのバグトラッキングシステム" src="http://www.opengroove.com/images/ciklone-banner.png" alt="ソフトウェアエンジニアのためのバグトラッキングシステム" width="224" height="50" /></a></p>

<p><a style="color: #999999;" href="http://ciklone.com/" title="ソフトウェアエンジニアのためのバグトラッキングシステム">ソフトウェアエンジニアのためのバグトラッキングシステム</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2010/06/30/cakephp-%e3%81%a7%e9%80%a3%e7%b5%90%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%81%af%e5%85%88%e3%81%ab%e5%ae%a3%e8%a8%80%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

