【问题标题】:How should I link these models to query multi tables via CakePHP associations?我应该如何链接这些模型以通过 CakePHP 关联查询多表?
【发布时间】:2013-04-09 06:50:16
【问题描述】:

我使用的是 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 公司
  • 有很多广告

代理

  • 属于用户

公司

  • 属于用户

广告

  • 属于用户

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

问题:

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

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

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

相关联

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

  1. 如果 ID 存在
  2. 如果扇区存在并且关联到 user_id

我该怎么做?

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


目前我在 AdsController/view 中的 find('first') 是:

$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 存在
  • 公司所属部门存在

如果上述之一不是“真”,我想得到一个空数组。

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

【问题讨论】:

  • 不要select *。 Plus Cake 会自动执行此操作。公司将按照您的要求包含在您的包含中。如果没有记录与外键匹配,则为空。
  • @DavidYell 在我写的时候没有显示公司。我只在结果中看到 Ad 和 User 数组。

标签: php cakephp cakephp-2.0


【解决方案1】:

我已经看到这个,由于某种原因包含相同的问题,该 array() 结构有点故障,也许它按它的意思工作,但我不明白,无论如何要检索链依赖关系我使用这个结构类型:

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

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

您的查询数组与您为问题提供的结构不匹配的另一件事是,您的Company 表中没有字段sector

【讨论】:

  • 我已经更正了数据库结构。我错了...好吧我会尝试使用'User.Company'...但这很奇怪,阅读文档(book.cakephp.org/2.0/en/core-libraries/behaviors/…)我发现我不需要使用Model1.Model2
  • 使用点表示法与数组嵌套相同。
  • @DavidYell 是的,我知道这一点,但由于某种原因,到目前为止未选中,点符号对我有用,不像包含中的数组嵌套
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多