【发布时间】:2016-03-14 22:46:37
【问题描述】:
在使用了几年 v1.3 之后,我才刚刚开始使用 CakePHP v3,所以有一些事情让我不知所措,或者更确切地说,不知如何“正确”地做到这一点
我有 2 个要搜索的表(产品和数据)。但是,最终用户提供的关键字可能与 products.title 或 data.value 字段之一匹配。我想要一个查询来返回所有分页结果,但似乎无法让 OR 组件跨越产品和数据表。
以下代码(我一直在尝试各种各样的东西)
$query = $this->Products->find("all");
$query->select($this->Products);
$query->contain(['Data']);
$query->where("MATCH(Products.code, Products.title) AGAINST(:search IN BOOLEAN MODE)");
$query->orWhere("MATCH(Data.value) AGAINST(:search IN BOOLEAN MODE)");
$query->bind(":search", $terms);
$query->select(["relevance" => "MATCH(Products.code, Products.title) AGAINST(:search IN BOOLEAN MODE)"]);
$this->paginate['sortWhitelist'] = ['code', 'title', 'uom', 'relevance'];
$products = $this->paginate($query);
$this->set(compact('products'));
返回以下错误
错误:SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列 'Data.value'
在检查查询时,我可以看到因为它没有将数据表连接到产品,因此 where 子句失败。使用matching() 方法似乎不允许返回产品中的结果而不是数据中的结果,反之亦然。
如何构造我的查询语句以实现类似于以下查询的内容(特别是“where”条件,我已经对字段本身进行了排序)
SELECT
Products.id, Products.title, [etc.],
MATCH(Products.code, Products.title) AGAINST('keyword' IN BOOLEAN MODE)
+ MATCH(Data.value) AGAINST('keyword' IN BOOLEAN MODE)
AS `relevance`
FROM
products Products
LEFT JOIN
data Data
on Data.product_id = Products.id
WHERE
MATCH(Products.code, Products.title) AGAINST('keyword' IN BOOLEAN MODE)
or
MATCH(Data.value) AGAINST('keyword' IN BOOLEAN MODE)
我当然想使用准备好的语句和 bind() 来帮助清理和重用用户数据。
【问题讨论】:
标签: cakephp cakephp-3.0