アソシエーションさせた他モデルのフィールドを指定してデータ取得する方法がわからない

アソシエーションさせた他モデルのフィールドを指定してデータ取得したいけど、方法がわからなくて悩んでいるというお話です。

テーブル構成の例

以下のようなテーブル構成になっていて、それぞれアソシエーションさせてあります。

  • Entry
    • id
    • title
    • body
    • category_id
    • user_id
    • created
    • modified
  • User
    • id
    • title
    • body
    • blog
    • hobby
    • sex
    • height
    • weight
    • created
    • modified
  • Comment
    • id
    • title
    • body
    • user_id
    • entry_id
    • created
    • modified
  • Category
    • id
    • title


これで $this->Entry->findByid($id) とすると、関連したデータを一発でとれて「すげえええええ」と感動したわけなのですが、「でも、このカラムのデータはいらないんだけど」ということが起きました。

User の特定カラムのデータだけ欲しい

Userからは id と title だけ表示させたいので、他の User データは必要ありません。
例なので項目が少ないですが、実際にはそれぞれもっとカラムを持っているので、データの量が結構あります。
サーバーのメモリが少ないので、余分なものはとにかく取らないようにしてメモリを節約したいというわけです。


取得 field の指定でうまくできないかな? と思い、以下のように試してみました。

$entry = $this->Entry->findById($id, array('User.id','User.title'));

もしくは

$entry = $this->Entry->find('all', array(
	'conditions' => array('Entry.id' => $id),
	'fields' => array('User.id','User.title')
	));

結果↓

Warning (512): SQL Error: 1109: Unknown table 'User' in field list [CORE/cake/libs/model/datasources/dbo_source.php, line 473]

Entry のデータから Userカラムのデータを取るクエリーになってしまい失敗。


指定してデータをとる方法はあるのだろうか。

bindModel して fields に指定すれば一応できた

正しいやり方なのかはわからないけど。

$this->Entry->bindModel(array(
	'belongsTo' => array(
		'User' => array(
			'fields' => array('User.id', 'User.title',),
		))
	)); 
$entry = $this->Entry->findById($id);

Array
(
    [Post] => Array
        (
            [id] => 3
            [title] => たいとる
            [body] => てすと
        )

    [User] => Array
        (
            [id] => 1
            [title] => Yossy
        )
)

こんなの毎回やるのバカバカしいなあ。


これが良さそうなので後で試してみよう