У меня была похожая проблема. Оказывается, мне пришлось вручную определять «с» в модели HABTM, хотя я (думал), что все мои поля соответствовали стандартному соглашению CakePHP. Кроме того, я не вижу, чтобы вы вызывали findByContacts в ваших filterArgs, но, возможно, я пропускаю это.
Итак, мой код работал так:
(Модель сокровищ, соответствующий код)
public $filterArgs = array(array('name' => 'makers', 'type' => 'subquery', 'method' => 'findByMaker', 'field' => 'Treasure.id'),);
public function findByMaker($data = array()) {
$this->MakersTreasure->Behaviors->attach('Containable', array('autoFields' => false));
$this->MakersTreasure->Behaviors->attach('Search.Searchable');
$query = $this->MakersTreasure->getQuery('all', array(
'conditions' => array("Maker.name LIKE '%" . $data['makers'] ."%'"),
'fields' => array('treasure_id'),
'contain' => array('Maker'),
//the limit does not work, but it does make the timeout query halt so you can see what's going on
//'limit'=>1
));
return $query;
}
И затем, также на модели, которую я должен был установить для Makers как таковой:
public $hasAndBelongsToMany = array(
'Maker' => array(
'className' => 'Maker',
'joinTable' => 'makers_treasures',
'foreignKey' => 'treasure_id',
'associationForeignKey' => 'maker_id',
'unique' => 'keepExisting',
'with' => 'MakersTreasure'
),
...
Так что в вашей функции не похоже, что вы ссылаетесь на модель соединения при выполнении запроса или в вашем «with». У вас есть таблица соединений в вашей базе данных для HABTM? Судя по всему, если у Contact есть FK card_id, то это не отношения HABTM, а OnetoMany или что-то еще.