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

时间:2013-04-09 06:50:16

标签: php cakephp cakephp-2.0

我正在使用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  |
--------------------------------------------------------------

这些是关联(模型):

用户

  • hasOne Agent
  • hasOne Company
  • hasMany Ads

代理

  • belongsTo User

公司

  • belongsTo User

广告

  • belongsTo User

注意: 请注意,当我添加新用户时,用户可以是代理 a公司。)

问题:

在我的 AdsController 中,我有一个名为 view 的动作,在那里我读了两个我从路线接收的参数:

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

我需要进行查询以检查 id 是否真的与 Ad.id 相关联,如果 < em> sector Company.sector

相关联

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

  1. 如果ID存在
  2. 如果扇区存在且与user_id相关联
  3. 我怎么能这样做?

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


    目前我在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);
    

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

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

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

    如果上面的某个不是“真”,我想得到一个空数组。

    显然我在广告模型中添加了可包含的行为。

1 个答案:

答案 0 :(得分:0)

我已经看过这个,有同样的问题,由于某种原因包含,有点故障与该array()结构,也许它的工作方式是什么意思,但我不明白,无论如何反转链依赖我使用这种结构:

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

但是,您需要记住,包含的条件与主模型的条件不同,因此即使公司部门不存在,但是具有给定ID出口的广告也不会收到空集。据我所知,如果模型之间没有直接关联,则不能使用条件来排除结果。所以你仍然需要检查$result['User']['Company']是否为空集。

您的查询数组与您提出的问题所提供的结构不一致,sector表格中没有字段Company