読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【CakePHP】アソシエーションで、hasManyとかのconditionsを動的に追加の仕方

CakePHP PHP

スポンサードリンク

とあるアソシエーションが組まれたModelを使って検索。

その際に条件を付与したかった。

関係についてはこんな感じ。

[Info] <= hasOne <= [Post] => hasMany => [PostItemRelation] <= hasMany <= [Item]
  • InfoはPostのidを持っている。
  • PostItemRelationはPostとItemのそれぞれのidを紐付けている

って感じですかね。

んで、Postを使って検索しようとしますよね。 そこで、条件を付与してあげたいのです。

<?php
$this->Post->find('first', array('conditions' => array('Item.name' => '')));

しかし、これだとエラーが発生します。

どうやら、hasManyの場合は一度に検索をするのではなく、2、3回に別けて検索するようです。 なので、初回の検索queryでエラーが発生するというわけ。

  • 最初にPostとInfoを検索(ここではまだItemはでてきていない => エラー!!)
  • PostItemRelationを検索
  • 最後にItemを検索

じゃあどうしましょうか。動的に追加してあげましょう。

<?php

// 動的に追加
$this->Post->hasMany['Item']['conditions'] = array('Item.name' => '');

// 検索
$this->Post->find('first');

// 終わったら戻す(空にする)
$this->Post->hasMany['Item']['conditions'] = array();

これでいけます!