【问题标题】:cakephp - one find() query to rule them allcakephp - 一个 find() 查询来统治它们
【发布时间】:2012-07-06 05:29:58
【问题描述】:

我定义了以下模型关系:

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”数据库表的连接。但是,如果我这样做:

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

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

我的问题是:在搜索 Author.id 之前,我需要做什么才能使表加入?我尝试使用 bindModel、containable、子查询,但由于某种原因(可能是 ID10T 错误)无法使它们工作。

感谢您的建议!

编辑: 以下调用的结果:

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

如下:

Array ( 

[0] => 数组 ( [出版物] => 数组([id] => 1 [title] => TestArticle [year] => 2011 [type_id] => 3) [类型] => 数组([id] => 3 [type_name] => 期刊文章) [作者] => 数组 ( [0] => Array ([id] => 2 [firstname] => Jeremy [lastname] => Gustine [middle] => A [faculty] => 0 [college_id] => 4 [AuthorsPublication] => Array ( [id] => 3 [author_id] => 2 [publication_id] => 1) [大学] => 数组([id] => 4 [college_name] => 文学、艺术和科学)) [1] => Array ( [id] => 3 [firstname] => George [lastname] => Obama [middle] => A [faculty] => 0 [college_id] => 6 [AuthorsPublication] => Array ( [id] => 2 [author_id] => 3 [publication_id] => 1) [College] => Array ([id] => 6 [college_name] => 公共事务学院)) [2] => Array ( [id] => 2 [firstname] => Jeremy [lastname] => Gustine [中间] => A [faculty] => 0 [college_id] => 4 [AuthorsPublication] => Array ( [id] => 1 [author_id] => 2 [publication_id] => 1) [College] => Array ([id] => 4 [college_name] => Letters, Arts, and Sciences)))) [1] => 数组 ( [出版物] => 数组([id] => 2 [title] => TestBook [year] => 2010 [type_id] => 1) [类型] => 数组([id] => 1 [type_name] => 书籍) [作者] => 数组 ( [0] => Array ( [id] => 7 [firstname] => Sony [lastname] => Stuff [middle] => L [faculty] => 0 [college_id] => 5 [AuthorsPublication] => Array ( [id] => 4 [author_id] => 7 [publication_id] => 2) [College] => Array ([id] => 5 [college_name] => 护理与健康科学) ) ) ) )

希望这有点可读...

【问题讨论】:

  • 大学不应该有很多作者吗?
  • 既然你提到它,是的,我认为它应该。尽管即使没有在 College 模型中定义该关联,但由于我正在使用 Rikesh 的以下建议,我仍然能够找到具有出版物的关联学院。

标签: php cakephp


【解决方案1】:

你的第二个发现是正确的

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

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

$this->Publication->recursive = 2;

【讨论】:

  • 非常好,这确实帮助我找到了相关的大学。谢谢!但是,我仍然无法按作者过滤结果。当我应用我在原始问题中指定的条件时,我仍然在“where 子句”中得到一个“未知列 'Author.id'”,因为与 Author 表的连接尚未发生。有什么想法吗?
  • 奇怪的是它应该可以工作。你能print_r你的输出删除那个条件吗。
  • 我编辑了问题以包含所请求的信息。对丑陋的格式感到抱歉....“代码”标签似乎没有涵盖所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2012-11-23
  • 2019-06-26
相关资源
最近更新 更多