CakePHP 从一个 habtm 返回多条记录

Posted

技术标签:

【中文标题】CakePHP 从一个 habtm 返回多条记录【英文标题】:CakePHP returning multiple records from a habtm 【发布时间】:2013-06-05 16:36:41 【问题描述】:

我在问题和类别之间有一种习惯关系。这种习惯关系是标准的,并在各自的模型中设置。我现在有以下问题。在控制器操作中,我有一个包含几个问题 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 关系的连接表。如何正确处理 habtm 关系,以便我可以传递一组问题 ID 并返回相关类别。

感谢任何提供时间或帮助的人。

【问题讨论】:

您可以取消绑定 habtm 并即时绑定 belongsTo:book.cakephp.org/2.0/en/models/… @timstermatic 我不确定你的意思。是绑定 cakePHP 的东西吗? 是的,在控制器中您可以动态添加不同类型的关联。 【参考方案1】:

使用连接

你需要生成的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'
            )
        )
    )
));

【讨论】:

谢谢。这解释了为什么我找不到该信息,我在文档中查找 find 方法。这正是我所需要的。

以上是关于CakePHP 从一个 habtm 返回多条记录的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

CakePHP hasAndBelongsToMany (HABTM) 删除加入记录

Cakephp HABTM saveAll 创建错误的数据库记录

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?

HABTM 关联未保存 - cakephp

如何将数据写入 CakePHP 中 HABTM 连接表的 HABTM 关联?