7

我正在开发一个 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
4

4 回答 4

7

将调试级别提高到 2 并查看 SQL 输出。找到您的代码正在生成的查询,您会注意到有几个。CakePHP 中的 ORM 层不会在第一个查询中加入 HABTM 相关表。它从第一次选择中获取结果,然后分别获取每个项目的 HABTM 数据。因为连接表不在第一个查询中,所以打算在连接表上使用的条件会导致您看到的错误。

这本烹饪书有一节介绍了HABTM 关联和根据 HABTM 表中满足您要求的条件获取数据。

于 2008-11-30T13:46:44.330 回答
5

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

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

$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')
));
于 2010-08-07T18:42:14.463 回答
2

您的表应该称为“schools_users”而不是“school_members”,因为它是多对多的,因此在两边的表名中使用复数形式是合适的。

您还将模型类名称“学校”设置为 HABTM 的别名。您应该将其更改为更通用的内容,例如“用户在并且拥有许多 SchoolS”中的“Schools”以避免冲突。

还有另一个提示:尝试“通过”学校模型而不是用户模型来查找用户。

$this->User->Schools->find()

希望这可以帮助。

于 2008-12-05T06:11:24.387 回答
0

FWIW,您的连接表确实似乎是“奇怪的命名”,因为它们不遵循此处描述的约定:

http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

无论如何,祝你好运,我记得 HABTM 在 CakePHP 中是个麻烦事。

于 2008-11-29T10:26:12.443 回答