在 hasAndBelongsToMany (HABTM) Cakephp 方面需要帮助

Posted

技术标签:

【中文标题】在 hasAndBelongsToMany (HABTM) Cakephp 方面需要帮助【英文标题】:Need help with hasAndBelongsToMany (HABTM) Cakephp find 【发布时间】:2010-09-16 18:38:23 【问题描述】:

我正在尝试在 Cakephp 1.3 中查询 hasAndBelongsToMany 关系,但看起来正在运行的 SQL 查询并未对多对多表进行联接。

我有一个 users 表、projects 表和 users_projects 表。我想在单独的分配控制器中获取用户关联的所有项目的列表。

我一直在阅读有关该主题的 cakephp 书:http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM

所以我一直在尝试这个:

var_dump($this->Allocation->User->Project->find('list',array('conditions'=>array('Project.user_id'=>'21'))));

但是这不起作用,它什么也不返回,而且这个错误:

Warning (512): SQL Error: 1054: Unknown column 'Projects.user_id' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 681]

Query: SELECT `Project`.`id`, `Project`.`name` FROM `projects` AS `Project` WHERE `Projects`.`user_id` = '21' 

看起来 cakephp 没有进行所需的连接。

这是在我的项目模型中:

var $hasAndBelongsToMany = array(
    'User' => array(
        'className' => 'User',
        'joinTable' => 'users_projects',
        'foreignKey' => 'project_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

这是在我的用户模型中:

var $hasAndBelongsToMany = array(
    'Project' => array(
        'className' => 'Project',
        'joinTable' => 'users_projects',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'project_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

那么,在 cakephp 中以多对多关系获取给定用户的项目列表的正确语法是什么?

【问题讨论】:

【参考方案1】:

可能是因为你没有让两个表名按字母顺序连接。users_projects 应该是projects_users

【讨论】:

@mrlanrat,但是您希望查询结果是什么样的? 我只想要与给定用户关联的项目和项目的 ID。 @mrlanrat,你已经这样做了,因为你已经指定了Project.user_id 我损失了 4 个小时,只是我的 hasandbelongstomany 表的名称被颠倒了....上帝保佑【参考方案2】:

您收到此错误是因为您使用的是查找类型“list”。 Cake 的默认行为是在使用这种查找类型时选择 ID 和 NAME 字段。

将您的查找类型更改为“全部”以检索您期望的结果:

var_dump($this->Allocation->User->Project->find('list',array('conditions'=>array('Project.user_id'=>'21'))));

【讨论】:

当更改为 all 时,我仍然得到同样的错误。这是 SQL 输出: 查询:SELECT Project.id, Project.name, Project.description, description, Project.created, Project.@98765@32 F@ROM 987654333@ AS Project WHERE Projects.user_id = '21' 我还希望返回的数据是列表格式,以便在 html 表单中使用。 在 User 和 Project 模型中重命名连接表后,您是否也更改了 'joinTable' => 'users_projects'?

以上是关于在 hasAndBelongsToMany (HABTM) Cakephp 方面需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP hasAndBelongsToMany (HABTM) 删除加入记录

CakePHP模型hasAndBelongsToMany关联

带有“hasAndBelongsToMany”的控制器的 CakePHP 条件查询

PHP CakePHP模型hasAndBelongsToMany关联

CakePHP hasAndBelongsToMany vs hasMany 通过

cakephp分页多个habtm