自己找不到令人满意的解决方案。我创建了一个行为来解决这个问题。
创建一个名为 HabtmBehavior.php 的文件并将其放在您的 app/Model/Behavior 文件夹中。将代码块放在那里并保存文件。
将行为添加到您的模型中:例如 public $actsAs = array('Habtm');
这是 find 的使用示例。
<?php $this->Entry->find('all', array('habtm'=>array('Tag'=>array('Tag.title'=>'value to find'))) ?>
分页看起来像这样:
$this->paginate['Entry']['habtm']['Tag'] = array('Tag.title'=>'value to find');
您可以通过在 habtm 数组中添加其他模型名称来随意添加任意数量的关系。(请注意不要让它变得复杂,因为这可能会开始减慢您的查找结果。)
<?php
class HabtmBehavior extends ModelBehavior {
public function beforeFind(Model $model, $options) {
if (!isset($options['joins'])) {
$options['joins'] = array();
}
if (!isset($options['habtm'])) {
return $options;
}
$habtm = $options['habtm'];
unset($options['habtm']);
foreach($habtm as $m => $scope){
$assoc = $model->hasAndBelongsToMany[$m];
$bind = "{$assoc['with']}.{$assoc['foreignKey']} = {$model->alias}.{$model->primaryKey}";
$options['joins'][] = array(
'table' => $assoc['joinTable'],
'alias' => $assoc['with'],
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array($bind)
);
$bind = $m.'.'.$model->{$m}->primaryKey.' = ';
$bind .= "{$assoc['with']}.{$assoc['associationForeignKey']}";
$options['joins'][] = array(
'table' => $model->{$m}->table,
'alias' => $m,
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array($bind) + (array)$scope,
);
}
return $options;
}
}
希望这可以帮助。快乐烘焙。