我有一个产品表和一个我想要搜索的元数据表。设法编写查询使其工作速度超快,我无法将其迁移到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的任何指导都将非常感激。
答案 0 :(得分:0)
BigDecimal#toPlainString()
用于加入关联。由于您的Products表与自身无关,因此无法使用它。而是使用leftJoinWith()
您需要将所有信息传递给该方法以构建连接条件。