蛋糕 find() 查询来统治它们


cakeone find() query to rule them all

我定义了以下模型关系:

class Publication extends AppModel {
    var $name = 'Publication';
    var $hasAndBelongsToMany = array(
        'Author'=>array(
            'className'=>'Author'
        )
    );     
}
class Author extends AppModel {
    var $name = 'Author';
    var $hasAndBelongsToMany = array(
        'Publication'=>array(
            'className'=>'Publication'
        )
    );
    var $belongsTo = array(
        'College' => array (
            'className' => 'College'
        )
    );      
}
class College extends AppModel {
    var $name = 'College';
var $hasMany = array(
        'Department'=>array(
            'className'=>'Department'
        )
    );      
}
class Department extends AppModel {
    var $name = 'Department';
var $belongsTo = array(
        'College'=>array(
            'className'=>'College'
        )
    );      
}

数据库表设置正确(连接 HABTM 的表等)。 我正在尝试找到一个数据库查询来统治它们。 我想创建一个查询,该查询将查找具有相关作者、学院、部门等的所有出版物。 从表单获取数据后,我尝试运行如下查询:

 $conditions = array(
            "Author.id" => $this->data['authors'],
            "Publication.year" => $this->data['year']                                
            );
$publications = $this->Publication->find('all', array('conditions' => $conditions));

这将引发 SQL 错误,指出 Author.id 不是有效字段。 现在,这是因为在搜索 Author.id 时尚未完成与 'authors' db 表的连接。 但是,如果我这样做:

$pubs = $this->Publication->find('all', array('conditions' => $conditions));

然后我得到一个数组,其中包含所有出版物和所有相关作者(尽管由于某种原因,不是相关的学院)。

我的问题是:在搜索表之前,我需要做什么才能使表 Author.id 连接? 我尝试使用绑定模型,可包含的子查询,但由于某种原因(可能是ID10T错误)无法让它们工作。

感谢您的任何建议!

编辑:以下调用的结果:

$this->Publication->recursive = 2;
$pubs = $this->Publication->find('all');

具体如下:

Array ( 

[0] => 数组 ( [出版物] => 数组 ( [id] => 1 [标题] => 测试文章 [年份] => 2011 [type_id] => 3 ) [类型] => 数组 ( [id] => 3 [type_name] => 期刊文章 ) [作者] => 数组 ( [0] => 数组 ( [id] => 2 [名字] => 杰里米 [姓氏] => 古斯汀 [中间] => A [教师] => 0 [college_id] => 4 [作者出版物] => 数组 ( [id] => 3 [author_id] => 2 [publication_id] => 1 ) [学院] => 数组 ( [id] => 4 [college_name] => 文学、艺术和科学 ) ) [1] => 数组 ( [id] => 3 [名字] => 乔治 [姓氏] => 奥巴马 [中] => A [教师] => 0 [college_id] => 6 [作者出版物] => 数组 ( [id] => 2 [author_id] => 3 [publication_id] => 1 ) [学院] => 数组 ( [id] => 6 [college_name] => 公共事务学院 ) ) [2] => 数组 ( [id] => 2 [名字] => 杰里米 [姓氏] => 古斯汀 [中] => A [教师] => 0 [college_id] => 4 [作者出版物] => 数组 ( [id] => 1 [author_id] => 2 [publication_id] => 1 ) [学院] => 数组 ( [id] => 4 [college_name] => 文学、艺术和科学 ) ) )[1] => 数组 ( [出版物] => 数组 ( [id] => 2 [标题] => 测试手册 [年份] => 2010 [type_id] => 1 ) [类型] => 数组 ( [id] => 1 [type_name] => 书籍 ) [作者] => 数组 ( [0] => 数组 ( [id] => 7 [名字] => 索尼 [姓氏] => 东西 [中间] => L [教师] => 0 [college_id] => 5 [作者出版物] => 数组 ( [id] => 4 [author_id] => 7 [publication_id] => 2 ) [学院] => 数组 ( [id] => 5 [college_name] => 护理和健康科学 ) ) ) )

希望这有点可读性...

你的第二个发现是正确的

$pubs = $this->Publication->find('all', array('conditions' => $conditions));

在此之上,尝试使用递归 2(下面的代码)来获取相关College

$this->Publication->recursive = 2;