我刚刚开始使用CakePHP v3经过几年的v1.3,所以有一些事情让我感到茫然,或者说不知道怎么做'正确'< / p>
我想要搜索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'
并且在检查查询时我可以看到,因为它没有将数据表连接到Products,因此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()来协助清理和重用用户数据。
答案 0 :(得分:0)
通常情况下,我解决了它。
最后,而不是使用$query->contain(['Data']);
我必须使用$query->leftJoinWith('Data')
一旦换掉它就行了!