我应该如何通过CakePHP关联链接这些模型来查询多表


How should I link these models to query multi tables via CakePHP associations?

我使用的是cakephp 2.3.2,我需要对多个表进行查询。

我有这个数据库:

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

这些是关联(模型):

用户

    <
  • 具代理/gh>
  • 具公司
  • <
  • hasMany广告/gh>
<

代理/strong>

  • belongsTo用户
公司

  • belongsTo用户

  • belongsTo用户

(注意: 请记住,当我添加一个新用户时,该用户可以是代理公司)

问题:

在我的AdsController中,我有一个名为view的操作,在那里我读取了我从路由收到的两个参数:

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

我需要做一个查询来检查是否id真的与Ad相关联。如果扇区Company.sector

相关联

我想用ONE find('first') 而不是检查

  1. 如果ID存在
  2. 如果扇区存在并且与user_id
  3. 相关联

我怎么能做到呢?

(如果查询找到Ad。id和Company。部门我需要检索广告和公司的所有字段)


目前我的查找('first')在AdsController/view是:

$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);

问题是Company现在显示在结果(数组)中。

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

  • AD ID已存在
  • 公司部门存在

如果上面的一个不是"true",我希望得到一个空数组。

显然我已经在广告模型中添加了Containable行为

我已经看到了这个,有同样的问题,由于某种原因包含,有点故障与数组()结构,也许它是如何工作的意思,但我不得到它,无论如何检索链依赖我使用这种结构:

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

但是,您需要记住,contains中的条件与main model中的条件不同,因此,即使company扇区不存在,但具有给定id的Ad退出,您也不会收到空集。据我所知,如果模型之间没有直接关联,就不能使用条件来排除结果。因此,您仍然需要检查$result['User']['Company']是否为空集。

还有一件事你的查询数组不匹配你的问题提供的结构,没有字段sector在你的Company