【问题标题】:CakePHP 3 left join and union in same queryCakePHP 3 在同一个查询中左连接和联合
【发布时间】:2016-03-17 20:22:34
【问题描述】:

我有一个要允许搜索的产品表和元数据表。设法编写查询使其运行得非常快,但我无法将其迁移到 CakePHP 3.x

这些表是标准的父->子设置,在相关数据字段上具有外键和全文索引。

我要模拟的查询是:

select products.*, sum(hits.relevance) as relevance from (
    SELECT  products.id, MATCH(products.code, products.title) AGAINST('"mm mmm"' IN BOOLEAN MODE) as relevance
    FROM    products
    WHERE   MATCH(products.code, products.title) AGAINST('"mm mmm"' IN BOOLEAN MODE)
union all
    SELECT  pim1.product_id as id, MATCH(pim1.value) AGAINST('"mm mmm"' IN BOOLEAN MODE) as relevance
    FROM    pim1 
    WHERE   MATCH(pim1.value) AGAINST('"mm mmm"' IN BOOLEAN MODE)
) as hits
left join products on products.id = hits.id
group by products.id
order by relevance desc

本质上,这允许 MySQL 比左连接更快地使用索引,合并结果,然后将其用作主表来左连接产品数据以传递给 paginate() 和视图。

我已对所有联合进行了排序,但我似乎无法让外部查询工作。

$pim = $this->Products  
       ->association("Pim1")    
       ->find('all')    
       ->select(['fk' => 'product_id']) 
       ->select(['relevance' => 'MATCH(value) AGAINST(:search IN BOOLEAN MODE)'])   
       ->where("MATCH(value) AGAINST(:search IN BOOLEAN MODE)") 
       ->bind(":search", $this->request->session()->read('search.wild_terms'));
$prd = $this->Products
       ->find('all')    
       ->select(['fk' => 'id']) 
       ->select(['relevance' => 'MATCH(code, title) AGAINST(:search IN BOOLEAN MODE)']) 
       ->where("MATCH(code, title) AGAINST(:search IN BOOLEAN MODE)")   
       ->bind(":search", $this->request->session()->read('search.wild_terms'));

这个位按照上面的子查询工作并运行联合

$query = $prd->unionAll($pim);

此位不允许我将产品数据附加到该联合的结果

$query->leftJoinWith("Products", function ($q) { return $q->where(['Products.id' => 'fk']); });

会报错

产品与产品没有关联

任何关于如何将我成功的 SQL 转换为 Cake 的指导将不胜感激。

【问题讨论】:

    标签: cakephp cakephp-3.0


    【解决方案1】:

    leftJoinWith() 用于加入关联。由于您的 Products 表不与自身关联,因此您无法使用它。而是使用 leftJoin() 您需要将所有信息传递给该方法以构建连接条件。

    【讨论】:

    • 那更接近了,但是由于联合没有我可以定义/访问的别名,所以我无法正确添加连接条件。当我尝试加入 Products 时,联合中的 Product 表出现别名问题。
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2012-08-08
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2014-07-06
    • 2019-05-31
    相关资源
    最近更新 更多