【发布时间】: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