我正在开发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
答案 0 :(得分:7)
将调试级别调高至2并查看SQL输出。找到您的代码生成的查询,您会发现有几个。 CakePHP中的ORM层不会在第一个查询中连接HABTM相关表。它从第一个选择中获取结果,然后分别获取每个项目的HABTM数据。由于连接表不在第一个查询中,因此您的条件(用于连接表)会导致您看到的错误。
烹饪书上有HABTM associations部分,并根据HABTM表格中的条件提取数据,以满足您的要求。
答案 1 :(得分:5)
来自食谱: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')
));
答案 2 :(得分:2)
你的桌子应该被称为“schools_users”,而不是“school_members”,因为它是多对多的,所以在双方的表名中使用复数形式是合适的。
您还将Model ClassName“School”设置为HABTM的别名。您应该将其更改为像“学校”这样更通用的内容,如“用户所在且拥有多个学校”,以避免冲突。
另一个提示:尝试通过学校模型而不是用户模型找到用户。
$这 - >用户 - > Schools->发现()
希望这有帮助。
答案 3 :(得分:0)
FWIW,您的联接表似乎“奇怪地命名”,只要它们不遵循此处描述的惯例:
http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM
无论如何,祝你好运,我记得HABTM在CakePHP中是一个屁股痛。