查找主表和关联表的结果

时间:2016-03-14 22:46:37

标签: cakephp cakephp-3.0

我刚刚开始使用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()来协助清理和重用用户数据。

1 个答案:

答案 0 :(得分:0)

通常情况下,我解决了它。

最后,而不是使用$query->contain(['Data']);

我必须使用$query->leftJoinWith('Data')

一旦换掉它就行了!