我通常不熟悉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,否则:
foreach($domains as $d):获取Subdomains的所有行,其中Subdomain.domain_id = Domains.id作为$subdomainsforeach($subdomains as $s):获取SubdomainsItems的所有行,其中SubdomainsItems.subdomain_id = Subdomains.id作为$item_idsforeach($items_ids as $i):获取Items的所有行,其中Items.id = SubdomainsItems.items_id这是可行的,但我认为这是在消除关系数据库的功能,我想了解应该如何做到这一点(即。根据Cakephp惯例或简单地说,MySQL语句可以实现这一点)。
帮助将是非常感谢的,我试着学习SQL更复杂的方面,但它只是在我的头上。:S
发布于 2013-07-14 17:24:19
理解必要的查询
在问题中所描述的结构中,所需的查询形式如下:
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创建这样的查询。最简单的方法可能是使用连接键,只需显式指定联接:
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);
}https://stackoverflow.com/questions/17636176
复制相似问题