$ this-> find('all',array(...))

时间:2014-07-14 16:42:45

标签: php arrays cakephp conditional-statements

我知道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'或手动的东西?或者到目前为止我还不知道蛋糕的方式吗?

4 个答案:

答案 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'
                        )
                    )
                )
            )
        );