CakePHP - HABTM find()不会将JOIN转换为其他表

时间:2012-09-10 12:56:02

标签: sql cakephp model find has-and-belongs-to-many

我的标题看起来很幼稚,但我不得不说我读取/搜索/测试了一切可能,但我的find()方法没有在SQL查询中实现JOIN到相关表。我在其他项目中多次使用它没有问题,但在这里......

这里我的2个模型(没有什么特别的,但相关模型的手动定义):

class Pflanzen extends AppModel {
    public $useTable = 'pflanzen';
    public $hasAndBelongsToMany  = array(
                        'Herbar'  => array(
                                        'order'=>'Herbar.order ASC',
                                        'joinTable' => 'herbar_pflanzen',
                                        'foreignKey' => 'pflanzen_id',
                                        'associationForeignKey' => 'herbar_id') 
            );
}
class Herbar extends AppModel {
    public $useTable = 'herbar';
    public $hasAndBelongsToMany = array(
              'Pflanzen' => array('joinTable' => 'herbar_pflanzen',
                                  'foreignKey' => 'herbar_id',
                                  'associationForeignKey' => 'pflanzen_id')
           )
}

这是我在“Herbar”控制器中的查询(不能更正常......):

$pflanzen = $this->Herbar->Pflanzen->find('all',array(
                          'fields'=>array('Herbar.name','Pflanzen.linkplatter'),
                          'conditions' => array('Pflanzen.linkplatter' => true),
                          'order' => 'Herbar.name',
                          'limit' => 10,
                          'recursive'=>2)
                         );
$this->set('pflanzen',$pflanzen);

以及视图中产生的错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Herbar.name' in 'field list'

SQL Query: SELECT `Herbar`.`name`, `Pflanzen`.`linkplatter`, `Pflanzen`.`id` FROM `burgerbib`.`platter_pflanzen` AS `Pflanzen` WHERE `Pflanzen`.`linkplatter` = '1' ORDER BY `Herbar`.`name` ASC LIMIT 10

你可以看到它们在SQL中没有JOIN。为什么?我错了什么? 我真的很感谢你的帮助,因为我正在寻找几个小时,不再看到任何解决方案,也没有找到任何使用谷歌的东西。在此先感谢!!

2 个答案:

答案 0 :(得分:0)

HABTM不会进行联接查询,它会根据需要为每个关系填充数组查询所有基本记录和更多查询。您的条件假定为连接,因此错误。

您可以使用'joins'参数强制加入。 http://book.cakephp.org/1.2/en/view/872/Joining-tables

答案 1 :(得分:-1)

最后,更好的方法是使用可包含的行为。强制连接仅在可包含行为不响应需求时才有用:

http://book.cakephp.org/2.0/fr/core-libraries/behaviors/containable.html#using-containable