【问题标题】:CakePHP searching in multiple HABTM tablesCakePHP 在多个 HABTM 表中搜索
【发布时间】:2013-12-10 15:38:00
【问题描述】:

我的数据库:我有 公司,其中 HABTM carbrands 和 HABTM 商品

我的搜索功能:

public function search() {
    $joins = array();
    // HABTM
    if (!empty($this->request->query['Carbrand'])) {
        $carbrands = array(
            'table' => 'carbrands_companies',
            'alias' => 'CarbrandsCompany',
            'type'  => 'INNER',
            'conditions' => array(
                'CarbrandsCompany.carbrand_id'  => $this->request->query['Carbrand'],
                'CarbrandsCompany.company_id = Company.id'
            ),
        );
        $joins[] = $carbrands;
    }
    if (!empty($this->request->query['Good'])) {
        $goods = array(
            'table' => 'companies_goods',
            'alias' => 'GoodsCompany',
            'type'  => 'INNER',
            'conditions' => array(
                'GoodsCompany.good_id'  => $this->request->query['Good'],
                'GoodsCompany.company_id = Company.id'
            ),
        );
        $joins[] = $goods;
    }
    // HABTM END
    $this->paginate = array(
        'fields' => array(
            'DISTINCT Company.id',
            'Company.name',
            'Company.addr',
            'Company.official',
        ),
        'limit'      => 10,
        'joins'      => $joins,
        'conditions' => array(),      
        'contain'    => array(),
        'order'      => array('Company.name' => 'asc')         
    );
    $found = $this->paginate('Company');
    if (!empty($found)) {
        $this->set('companies', $found);
    }else {
        $this->render('notfound');
    }
}

它运行良好,除了一件事:它提供了非常严格的搜索。 我需要找回所有拥有 Carbrand A 的公司以及所有拥有 Good B 的公司。 p>

如果我在搜索表单中指定所需条件,Cake 将生成以下 SQL:

 SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official` FROM `autov`.`companies` AS `Company` 
 INNER JOIN `autov`.`carbrands_companies` AS `CarbrandsCompany` ON (`CarbrandsCompany`.`carbrand_id` = ('23') AND `CarbrandsCompany`.`company_id` = `Company`.`id`) 
 INNER JOIN `autov`.`companies_goods` AS `GoodsCompany` ON (`GoodsCompany`.`good_id` = ('1') AND `GoodsCompany`.`company_id` = `Company`.`id`) 
 WHERE 1 = 1 ORDER BY `Company`.`name` asc 
 LIMIT 10

显然 0 结果来自 database 。据我所知,这是因为我的功能非常严格,Cake 寻找具有 Carbrand A 并且具有 Good 的 Company B 同时。

但这不是我需要的。

以下查询获取所需的结果:

SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official`         
FROM `auto`.`companies` AS `Company` 
INNER JOIN `auto`.`carbrands_companies` AS `CarbrandsCompany` ON
(`CarbrandsCompany`.`carbrand_id` = ('23') AND `CarbrandsCompany`.`company_id` = `Company`.`id`)

UNION

SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official` FROM `auto`.`companies` AS `Company` 
INNER JOIN `auto`.`companies_goods` AS `GoodsCompany` ON (`GoodsCompany`.`good_id` = ('1') AND `GoodsCompany`.`company_id` = `Company`.`id`) 
WHERE 1 = 1
LIMIT 100

如何更改我的函数以获取 CakePHP 生成的所需 SQL 查询?

【问题讨论】:

  • 您希望得到的 SQL 是什么?
  • @Dave 我希望找出我的错误在哪里以及如何更改我的函数以获得我需要的结果。
  • 我不是在问你一般的希望和梦想——我是在问——你希望 CakePHP 为你生成的实际 MySQL 查询是什么。如果您能做到这一点,我们将很容易帮助您确定与实际产生的不同以及原因。
  • Cake 为我生成的@Dave 查询是我的函数告诉我生成的。抱歉,我不知道如何使用 SQL 获取我需要的结果,所以我无法为您提供示例。如果我只使用一个内部连接,例如我只是在寻找“品牌”,一切都很好。 “货物”也是如此。但我需要两者的联合结果 = 能够列出所有拥有“品牌”A 的公司以及所有拥有“好”B 的公司。
  • 编写查询,以便在 MySQL 中获得所需的结果(phpMyAdmin、HeidiSQL、Navicat、'->query()'...等),然后在此处显示。

标签: mysql sql cakephp has-and-belongs-to-many


【解决方案1】:

听起来您正在寻找的是:

SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official`    
FROM `autov`.`companies` AS `Company` 
INNER JOIN `autov`.`carbrands_companies` AS `CarbrandsCompany` 
ON `CarbrandsCompany`.`company_id` = `Company`.`id`
INNER JOIN `autov`.`companies_goods` AS `GoodsCompany` 
ON `GoodsCompany`.`company_id` = `Company`.`id`
WHERE `CarbrandsCompany`.`carbrand_id` = 23  OR
`GoodsCompany`.`good_id` = 1
ORDER BY `Company`.`name` asc 
LIMIT 10

换句话说,我认为如果您将每个连接上的连接条件移到 $this->paginate['conditions'] 中,它应该可以工作:

$this->paginate['conditions'] => array('OR' => array('GoodsCompany.good_id' => 1,  'CarbrandsCompany.carbrand_id' => 23));

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多