CakePHP 3在同一查询中左连接和并集

CakePHP 3在同一查询中左连接和并集,cakephp,cakephp-3.0,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"'

我有一个产品表和一个元数据表,我想允许搜索。我已经设法编写了查询,使其运行得非常快,但在将其迁移到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'));
此位按照上面的子查询工作并运行union

$query = $prd->unionAll($pim);
这一点不允许我将产品数据附加到该联盟的结果中

$query->leftJoinWith("Products", function ($q) { return $q->where(['Products.id' => 'fk']); });
它抛出了一个错误

产品与产品不关联


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

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

这更接近,但是,由于联合没有我可以定义/访问的别名,因此我无法正确添加连接条件。当我尝试加入产品时,我在联合中的产品表中遇到了一个别名问题。