首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP2.3:构建复杂的条件模型->find()选项

CakePHP2.3:构建复杂的条件模型->find()选项
EN

Stack Overflow用户
提问于 2013-07-14 03:07:03
回答 1查看 197关注 0票数 1

我通常不熟悉MySQL或数据库,因此这里有一个数据模型(表{cols}),以便使我的问题连贯一致:

Domains{id, name}注意:此处“域”不指web域

Subdomains{id, domain_id, name}

Items{id, subdomain_id, name}

SubdomainsItems{id, subdomain_id, item_id} no domain_id列!

我的Items Controller有一个函数,fetchWithin($domains, $subdomains),它最终应该只执行两个复杂的find()之一。这是我无法通过的复杂局面。

在编程上,我可以做到这一点,但我非常肯定,更好的方法是通过聪明的连接等。唉,目前的做法是:

如果$domains__is为空,则只执行步骤2和3,否则:

  1. foreach($domains as $d):获取Subdomains的所有行,其中Subdomain.domain_id = Domains.id作为$subdomains
  2. foreach($subdomains as $s):获取SubdomainsItems的所有行,其中SubdomainsItems.subdomain_id = Subdomains.id作为$item_ids
  3. foreach($items_ids as $i):获取Items的所有行,其中Items.id = SubdomainsItems.items_id

这是可行的,但我认为这是在消除关系数据库的功能,我想了解应该如何做到这一点(即。根据Cakephp惯例或简单地说,MySQL语句可以实现这一点)。

帮助将是非常感谢的,我试着学习SQL更复杂的方面,但它只是在我的头上。:S

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-14 17:24:19

理解必要的查询

在问题中所描述的结构中,所需的查询形式如下:

代码语言:javascript
复制
SELECT
    *
FROM
    items
LEFT JOIN
    subdomains ON (
        items.subdomain_id = subdomains.id
    )
LEFT JOIN
    domains ON (
        subdomains.domain_id = domains.id
    )
WHERE
    domains.name = "foo"
    AND
    subdomains.name IN ('some', 'list', 'of', 'subdomains');

与问题中的逻辑相比,这将所有三个表连接在一起,并允许按域名或子域名(或涉及任何或全部三个表的任何其他条件)查找所有项;一般来说,如果您想在db中查找数据并使用多个查询来获取数据,那么有一种更有效的方法。

实现查找调用

有许多方法可以用Cake创建这样的查询。最简单的方法可能是使用连接键,只需显式指定联接:

代码语言:javascript
复制
function fetchWithin($domains = null, $subdomains = null) {
    $params = array(
        'joins' =>  array(
            array('table' => 'subdomains',
                'alias' => 'Subdomain',
                'type' => 'LEFT',
                'conditions' => array(
                    'Subdomain.id = Item.subdomain_id',
                )
            ),
            array('table' => 'domains',
                'alias' => 'Domain',
                'type' => 'LEFT',
                'conditions' => array(
                    'Domain.id = Subdomain.domain_id',
                )
            )
        )
    );

    if ($domains) { // single value or an array
        $params['conditions']['Domain.name'] = $domains;
    }

    if ($subdomains) { // single value or an array
        $params['conditions']['Subdomain.name'] = $subdomains;
    }

    return $this->find('all', $params);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17636176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档