私は 2 日前に andConditions について質問するために書きましたが、その考えを理解していないように見えましたが、実際には 2 日間、CakeDC を使用して次のステップに行き詰まっています。
CakeDC 検索プラグインの「クエリ」メソッドで複雑な HABTM 条件を実装するにはどうすればよいですか?
私はオファーHABTM機能(テーブル:オファー、機能、features_offers)を持っており、コントローラーで使用すると以下がうまく機能します:
debug($this->Offer->find('all', array('contain' => array(
'Feature' => array(
'conditions' => array(
'Feature.id in (8, 10)',
)
)
)
)
)
);
検索で同じ条件を使用したい場合に問題が発生します。
public $filterArgs = array(
array('name' => 'feature_id', 'type' => 'query', 'method' => 'findByFeatures'),
);
........
public function findByFeatures($data = array()) {
$conditions = '';
$featureID = $data['feature_id'];
if (isset($data['feature_id'])) {
$conditions = array('contain' => array(
'Feature' => array(
'conditions' => array(
'Feature.id' => $data['feature_id'],
)
)
)
);
}
return $conditions;
}
エラーが発生します:
エラー: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'where 句' の 'contain'
これにより、この検索を実行したり、検索で包含可能な動作をまったく使用したりできないと思います。
この分野でより多くの経験を積んだ人が、何か不足している場合は教えてください。または、その解決策を正確に見つける場所を教えてください。おそらくクックブックのセクションですか?
編集:結合も試しました。これはコントローラーで完全に機能し、必要なすべてのデータを返します。
$options['joins'] = array(
array('table' => 'features_offers',
'alias' => 'FeaturesOffers',
'type' => 'inner',
'conditions' => array(
'Offer.id = FeaturesOffers.offer_id'
),
array('table' => 'features',
'alias' => 'F',
'type' => 'inner',
'conditions' => array(
'F.id = FeaturesOffers.feature_id'
),
)
),
);
$options['conditions'] = array(
'feature_id in (13)' //. $data['feature_id']
);
debug($this->Offer->find('all', $options));
...そして、検索メソッドを入れようとすると、返された条件は SQL の where 句でのみ取得されます
WHERE ((joins = (Array)) AND (conditions = ('feature_id in Array')))
...エラーになります:
SQLSTATE [42S22]: 列が見つかりません: 1054 不明な列 'where 句' の列 '結合'
編集: 多分私は愚かで、申し訳ありませんが、プラグインのドキュメントはひどいものです。
私は 2 重、3 重、4 重にチェックしました (ちなみに、検索フォームfacepalmの少なくとも 1 つのフィールドですでに 30 時間を失っています)、ドキュメントの愚かな findByTags はまだ意味がありません。
public function findByTags($data = array()) {
$this->Tagged->Behaviors->attach('Containable', array('autoFields' => false));
$this->Tagged->Behaviors->attach('Search.Searchable');
$query = $this->Tagged->getQuery('all', array(
'conditions' => array('Tag.name' => $data['tags']),
'fields' => array('foreign_key'),
'contain' => array('Tag')
));
return $query;
}
私が理解しているように
$this->Tagged
は、HABTM 協会のモデルの名前であるはずです。
ただし、これはCakePHPの標準からはかなりかけ離れています。
ここで説明されている方法では、別のモデルは必要なく、以下に示すように Recipe を Ingredient に関連付けることを示しています。
class Recipe extends AppModel {
public $hasAndBelongsToMany = array(
'Ingredient' =>
array(
'className' => 'Ingredient',
'joinTable' => 'ingredients_recipes',
'foreignKey' => 'recipe_id',
'associationForeignKey' => 'ingredient_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
}
つまり、モデル「IngredientRecipe」を定義する必要なく、Recipe から HABTM 関連テーブル データにアクセスできます。
そして、cakeDC のドキュメントによると、必要なモデルは IngredientRecipe であり、cakePHP のドキュメントでは必須のものとして示されていません。このモデルを作成しても、HABTM アソシエーションが正しく動作しません - 私もこれを試しました。
そして今、検索機能を自分のやり方で書き直す必要があります。すでに 30 時間も費やしていたにもかかわらず、cakePHP だけを使用して...とても残念です。:(