代码之家  ›  专栏  ›  技术社区  ›  Daniel

如何使用habtm关系在cakephp中查询数据?

  •  7
  • Daniel  · 技术社区  · 16 年前

    我正在开发一个cakephp 1.2应用程序。我有一个模型“user”,通过一个连接表定义了一些与其他表的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 回复  |  直到 11 年前
        1
  •  7
  •   joshua.paling    11 年前

    将调试级别提高到2并查看sql输出。找到代码生成的查询,您会发现有几个查询。cakephp中的orm层不会在第一个查询中连接与habtm相关的表。它从第一个select获取结果,然后分别获取每个项的habtm数据。因为联接表不在第一个查询中,所以用于联接表的条件将导致您看到的错误。

    烹饪书有一节 HABTM associations 并根据habtm表中符合您要求的条件获取数据。

        2
  •  5
  •   LPL user462990    13 年前

    从食谱上看: http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

    一种选择是搜索标签模型(而不是recipe),它也会给我们提供所有相关的recipe。

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

    我们还可以使用join表模型(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')
    ));
    
        3
  •  2
  •   m3nt0r    16 年前

    你的表应该叫“学校用户”而不是“学校成员”,因为它是多对多的,因此在两边的表名中使用复数形式是合适的。

    还可以将模型类名“school”设置为HABTM的别名。为了避免冲突,您应该将其更改为更通用的“学校”,如“用户所在的学校很多”。

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

    $this->用户->学校->查找()

    希望这有帮助。

        4
  •  0
  •   J Cooper    16 年前

    fwiw,您的联接表看起来确实“命名奇怪”,因为它们不遵循这里描述的约定:

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

    无论如何,祝你好运,我记得habtm在cakephp是个屁股痛。