当前位置:  开发笔记 > 编程语言 > 正文

如何使用HABTM关系在CakePHP中查询数据?

如何解决《如何使用HABTM关系在CakePHP中查询数据?》经验,为你挑选了2个好方法。

我正在开发CakePHP 1.2应用程序.我有一个模型"用户"通过连接表定义了与其他表的几个HABTM关系.

我现在的任务是根据存储在其中一个HABTM表中的数据查找用户信息.不幸的是,当查询执行时,我的条件被拒绝,并显示有关丢失表的错误.在检查时,似乎CakePHP不包括select语句中的任何HABTM表.

我的用户HABTM关系如下:

    var $hasAndBelongsToMany = array(
    'Course' => array(
        'className'             => 'Course',
        'joinTable'              => 'course_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'course_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    ),
    'School' => array(
        'className'             => 'School',
        'joinTable'              => 'school_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'school_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    ),
    'Team' => array(
        'className'             => 'Team',
        'joinTable'              => 'team_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'team_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    )
);

错误是:

SQL错误:1054:'where子句'中的未知列'School.name'

最后,它正在尝试执行的查询

     SELECT 
 `User`.`id`, `User`.`username`, `User`.`password`, `User`.`firstName`, `User`.`lastName`, `User`.`email

`, `User`.`phone`, `User`.`streetAddress`, `User`.`city`, `User`.`province`, `User`.`country`, `User

`.`postal`, `User`.`userlevel`, `User`.`modified`, `User`.`created`, `User`.`deleted`, `User`.`deleted_date

` FROM `users` AS `User`   WHERE `User`.`id` = 6 AND `School`.`name` LIKE '%Test%'    LIMIT 1

neilcrookes.. 7

将调试级别调高至2并查看SQL输出.找到您的代码生成的查询,您会发现有几个.CakePHP中的ORM层不会在第一个查询中连接HABTM相关表.它从第一个选择中获取结果,然后分别获取每个项目的HABTM数据.由于连接表不在第一个查询中,因此您的条件(用于连接表)会导致您看到的错误.

该烹饪书有一个关于HABTM关联的部分,并根据HABTM表中符合您要求的条件获取数据.



1> neilcrookes..:

将调试级别调高至2并查看SQL输出.找到您的代码生成的查询,您会发现有几个.CakePHP中的ORM层不会在第一个查询中连接HABTM相关表.它从第一个选择中获取结果,然后分别获取每个项目的HABTM数据.由于连接表不在第一个查询中,因此您的条件(用于连接表)会导致您看到的错误.

该烹饪书有一个关于HABTM关联的部分,并根据HABTM表中符合您要求的条件获取数据.



2> 小智..:

来自食谱:http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

一种选择是搜索Tag模型(而不是Recipe),这也将为我们提供所有相关的食谱.

$this->Recipe->Tag->find('all', array(
    'conditions' => array('Tag.name' => 'Dessert')));

我们还可以使用连接表模型(CakePHP为我们提供)来搜索给定的ID.

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag')));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('RecipesTag.tag_id' => 124) // id of Dessert
));

也可以创建一个奇特的关联,以便根据需要创建尽可能多的连接以允许过滤,例如:

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag',
    'FilterTag' => array(
        'className' => 'Tag',
        'foreignKey' => false,
        'conditions' => array('FilterTag.id = RecipesTag.tag_id')
))));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('FilterTag.name' => 'Dessert')
));

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有