CakePHP 3在同一个查询中保留了join和union

时间:2016-03-17 20:22:35

标签: cakephp cakephp-3.0

我有一个产品表和一个我想要搜索的元数据表。设法编写查询使其工作速度超快,我无法将其迁移到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比左连接更快地使用索引,将结果联合起来,然后使用它作为主表,将产品数据连接到handgin()和视图。 / p>

我对工会进行了全部排序,但我似乎无法使外部查询起作用。

$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的任何指导都将非常感激。

1 个答案:

答案 0 :(得分:0)

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