2013-04-09 121 views
0

我正在使用cakephp 2.3.2,我需要在多个表上进行查询。如何链接这些模型以通过CakePHP关联查询多个表?

我有这个数据库:

-------------------------------------------------------------- 
| Users  | Agents  | Companies | Ads | 
-------------------------------------------------------------- 
|  id  |  id  |  id  | id  | 
| username |  name  |  company  | title | 
| password | lastname |  sector  | message | 
|    |  user_id |  user_id  | user_id | 
-------------------------------------------------------------- 

这些都是协会(模型):

用户

  • hasOne代理
  • hasOne公司
  • 的hasMany广告

代理

  • 属于关联用户

公司

  • 属于关联用户

广告

  • 属于关联用户

注:请记住,当我补充一点,用户可以代理一个公司的新用户。)

问题:

在我AdsController我有一个动作命名为视图,还有我看了两个参数,我从路线receve:

$this->params['id'] 
$this->params['sector'] 

我需要做一个查询,以检查是否ID真的是关联到一个Ad.id和如果部门关联到公司。部门

我想与检查它一个发现(“第一”),而不是检查

  1. 如果ID存在
  2. 如果行业存在的和它相关联到user_id

我该怎么办?

(如果查询发现Ad.id和Company.sector我需要检索广告的各个领域和公司)


此刻我查找AdsController(“第一”) /看法是:

$options = array(
    'fields' => array(
     'Ad.*' 
    ), 
    'contain' => array(
     'User' => array(
      'Company' => array(
       'fields' => array(
        'Company.*' 
       ), 
       'conditions' => array(
        'Company.sector' => $this->params['sector'], 
       ), 
      )  
     ) 
    ), 
    'conditions' => array(
     'Ad.id' => $this->params['id'], 
    ) 
) 

$data = $this->Ad->find('first', $options); 
debug($data); 

的问题是,公司在结果(数组)现在显示。

请记住,我只需要IF检索数组:

  • 广告的ID存在
  • 公司的部门存在

如果上面的一个是不是“真”我想获得一个空阵列。

显然我在Ad模型中添加了可容忍的行为。

+0

不要选择'*'。 Plus Cake会自动执行此操作。公司将被包含在您要求它包含在您的Contain中。如果没有记录匹配外键,它将是空的。 – 2013-04-09 08:47:03

+0

@DavidYell,因为我写的公司没有显示。我只在结果中看到广告和用户数组。 – Dail 2013-04-09 08:48:01

回答

0

我见过这个,有同样的问题,由于某种原因包含,有点该数组()结构的故障,也许它的工作原理是如何,但我没有得到它,无论如何检测链依赖我使用这样的结构:

$options = array(
     'contain' => array(
      'User', 
      'User.Company' => array(
       'conditions' => array(
        'Company.sector' => $this->params['sector'], 
       ), 
      )     
     ), 
     'conditions' => array(
      'Ad.id' => $this->params['id'], 
     ) 
    ) 

但是,你必须记住,在条件包含不一样的主力机型的条件下,therfore即使公司部门不存在,但与指定id广告退出你将不会收到一个空集。据我所知,如果模型之间没有直接关联,则不能使用条件来排除结果。因此,您仍然需要检查$result['User']['Company']是否为空集。

一件事查询数组不匹配您提供与您问题的结构,没有场sectorCompany

+0

我已更正数据库结构。我错了......好吧我会尝试使用'User.Company'...但这很奇怪,阅读文档(http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable。 html)我看到我不需要使用Model1.Model2 – Dail 2013-04-09 13:04:19

+0

使用点符号与数组嵌套相同。 – 2013-04-09 13:05:05

+0

@DavidYell是的我意识到这一点,但由于某种原因,迄今为止未检查,点符号为我工作不像数组嵌套在包含 – johhniedoe 2013-04-09 13:06:51