我在问题和类别之间有一个habtm关系。这个habtm关系是标准的,并在相应的模型中设置。我现在有以下问题。在控制器操作中,我有一个由几个问题id组成的数组。我想返回所有与这些问题相关的类别。我正在使用的发现如下。
$case_questions_categories = $this->Category->find('all', array('conditions' => array('OR' => $case_question_id_array)));
// Here the $case_question_id_array is generated as followed:
foreach($question['CaseQuestion'] as $case_question) {
$case_question_id_array[] = "Category.question_id = " . $case_question['id'];
}
很明显,这是行不通的,它会抛出以下错误:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Category.question_id' in 'where clause'
SQL Query: SELECT `Category`.`id`, `Category`.`name`, `Category`.`slug`, `Category`.`category_order`, `Category`.`created`, `Category`.`modified`, `Category`.`is_deleted` FROM `streetofwalls`.`categories` AS `Category` WHERE `Category`.`question_id` = 182
这是有意义的,因为我生成的查询中没有引用habtm关系中的join表。如何正确处理habtm关系,以便传递一组问题id并返回相关类别。
感谢任何提供时间或帮助的人。
最佳答案
使用连接
需要生成的sql查询类型是:
SELECT
categories.* from categories
JOIN
categories_questions ON (categories_questions.category_id = categories.id)
WHERE
categories_questions.question_id IN (list, of, question, ids)
最简单的方法就是在查询中使用
join
键,这也是in the documentation。应用于问题中的示例:
$ids = array()
foreach($question['CaseQuestion'] as $q) {
$ids[] = $q['id'];
}
$this->Category->find('all', array(
'conditions' => array(
'CategoriesQuestion.id' => $ids // You do not need an OR
),
'joins' => array(
array(
'table' => 'categories_questions',
'alias' => 'CategoriesQuestion',
'type' => 'inner',
'conditions' => array(
'Category.id = CategoriesQuestion.category_id'
)
)
)
));
关于php - CakePHP从habtm返回多个记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16945323/