我知道find-all是如何工作的,我写了一个搜索查询,它将在数据表的不同列中搜索表达式。一切顺利。
但是现在,我想在平面数据数组中搜索表达式,我想在子数组中搜索。我有以下结构:
[Company] => Array
(
[id] => 1
[user_id] => 3
[name] => TEAM-Security
[address1] => Dorfstrasse 9
)
[Service] => Array
(
[0] => Array
(
[id] => 2
[cat] => Reinigung
[name] => Baureinigung
[created] => 2014-07-13 00:00:00
[modified] => 2014-07-13 00:00:00
)
[1] => Array
(
[id] => 3
[cat] => Reinigung
[name] => Wohnungsreinigung
[created] => 2014-07-13 00:00:00
[modified] => 2014-07-13 00:00:00
)
)
现在,我可以搜索不同的"公司列"。现在,我想在Service-childs的列中进行搜索。我阅读了很多博客,网页等,但我找不到任何提示如何解决这个问题。
到目前为止我的简单解决方案:
$searchterm = 'TEAM';
$pending = $this->Company->find('all', array(
'conditions' => array('Company.name like' => '%$searchterm%')
));
我遇到的麻烦,我想现在在一个带有子阵列的孩子身上搜索。我想搜索" Baureinigung" 等。我是否必须做一个' foreach'或手动的东西?或者到目前为止我还不知道蛋糕的方式吗?
答案 0 :(得分:0)
您可以使用可包含的行为对关联数据执行一些搜索。例如:
$this->find(
'all',
array(
'conditions' => array('Company.name like' => '%$searchterm%'),
'contain' => array(
'Service' => array(
'conditions' => array(
'Service.name like' => '%$searchterm%'
)
)
)
)
);
请注意,在这样的同时对多个表进行搜索时,您必须特别注意连接类型。默认情况下,模型关联表现为左连接。
答案 1 :(得分:0)
这是我使用Cake时最大的痛苦之一 - 尝试搜索更深的列并使用除LEFT连接之外的任何其他内容。这对我有用。我假设你在公司模型中工作 - 如果没有,你应该是。可以稍微修改它以在Controller中工作,但它属于模型。我还假设您的HABTM正在使用名为companies_services
首先将当前关联解除绑定到要为查询进行内部联接的表:
$this->unbindModel(array('hasAndBelongsToMany' => array('Service')));
然后,您需要使用INNER联接明确地连接表。要在CakePHP 2.x中执行此操作,请在find方法的options参数中使用join键:
$this->find('all', array(
'joins' => array(
array(
'table' => 'companies_services',
'alias' => 'CompanyServices',
'type' => 'INNER',
'conditions' => array(
'CompanyServices.company_id = Company.id'
)
),
array(
'table' => 'services',
'alias' => 'Service',
'type' => 'INNER',
'conditions' => array(
'Service.id = CompanyServices.id',
'Service.name LIKE ' => '%' . $service_search_term . '%'
)
),
),
'conditions' => array('Company.name LIKE ' => '%'. $company_search_term . '%',
'recursive' => -1
));
我要注意的另一件事是我遇到过这样的情况,我必须在执行此操作后显式声明我想要返回的字段。为此,您可以在上面的选项数组中添加“字段”键,例如(从上面的“递归”行开始):
...
'recursive' => -1,
'fields' => array(
'Company.id',
'Company.name',
'CompanyServices.company_id',
'CompanyServices.service_id',
'Service.id',
'Service.name'
)
....
答案 2 :(得分:0)
在Company
模型中,您已定义了直接关联,例如
class Company extends AppModel
{
var $name = 'Company';
var $hasAndBelongsToMany = array('Service' =>
array(
'fields' => array('name')
)
);
}
之后你可以试试
$pending = $this->Company->find('all', array(
'conditions' => array("OR" => array(
'Company.name like' => '%$searchterm%',
'Service.name like' => '%$searchterm%'
)))
);
答案 3 :(得分:0)
这个解决方案有点复杂,可能没有优化但会起作用:
$data = $this->Company->find('all', array(
'conditions' => array(
"OR" => array(
'Company.name like' => '%$searchterm%',
'Service.name like' => '%$searchterm%'
)
),
'contain' => array(
'Service' => array(
'conditions' => array(
'Service.name like' => '%$searchterm%'
)
)
),
'joins' => array(
array(
'table' => 'companies_services',
'alias' => 'CompanyServices',
'type' => 'INNER',
'conditions' => array(
'CompanyServices.company_id = Company.id'
)
),
array(
'table' => 'services',
'alias' => 'Service',
'type' => 'INNER',
'conditions' => array(
'Service.id = CompanyServices.id'
)
)
)
)
);