0

我想按权限搜索例如 $data['competences'] =java+oracle,sql 然后请求权限的方法必须知道 java 是第一个 oracle 是第二个,sql 是第三个。我为foreach()提供了这个错误无效参数我猜prb在 $data = array('competences' =>'First%+Second%, Third%'); or at

$result = $this->CompetencesUser->parseCriteria($data);`

在我的查询请求中,我有这个惊喜:

SELECT `User`.`id`, `User`.`username`, `User`.`nom`, `User`.`prenom`, `User`.`email`, `User`.`password`, `User`.`created`, `User`.`modified` FROM `dcsearch`.`users` AS `User` WHERE User.id in (SELECT `CompetencesUser`.`user_id` FROM `dcsearch`.`competences_users` AS `CompetencesUser` LEFT JOIN `dcsearch`.`competences` AS `Competence` ON (`CompetencesUser`.`competence_id` = `Competence`.`id`) WHERE ((((`Competence`.`competence` LIKE '%First\\%%') AND (`Competence`.`competence` LIKE '%Second\\%%'))) OR (`Competence`.`competence` LIKE '%Third\\%%'))) LIMIT 20

这是我的模型 user.php

public $hasAndBelongsToMany = 

    array(
            'Competence' => array(
                'with' => 'CompetencesUser',
                'className' => 'Competence',
                'joinTable' => 'competences_users',
                'foreignKey' => 'user_id',

public $filterArgs = array(

    'competences' => array(

                'type' => 'subquery',
                'method' => 'findByCompetences',
                'field' => 'User.id',

             'connectorsAnd' => '+', 
             'connectorOr' => ',',
              'before' => true,
               'after' => false)

    );

 public function findByCompetences($data = array()) {



$this->CompetencesUser->Behaviors->attach('Containable', array(
            'autoFields' => false
        )
    );

    $this->CompetencesUser->Behaviors->attach('Search.Searchable');
    //$data = array('competences' => 'Cake');

    $data = array('competences' => 'First%+Second%, Third%');

    $result = $this->CompetencesUser->parseCriteria($data);

    $expected = array(0 => array('OR' => array(
        array('AND' => array(
            array('Competence.competence LIKE' => '%First\%%'),
            array('Competence.competence LIKE' => '%Second\%%'),
        )),
        array('AND' => array(
            array('Competence.competence LIKE' => '%Third\%%')
        )),
    )));


    $query = $this->CompetencesUser->getQuery('all', array(

       'conditions' =>array(
        $expected,
        $result),


        'fields' => array(
          'user_id'
       ),
        'contain' => array(
           'Competence'


   )));





     return $query;
}
4

1 回答 1

0

我怀疑您的问题可能在于:

  1. 模型中filterArgsCompetencesUsername competences,您没有包括...正在处理以创建$result您在上面的名称。
  2. 公共进程 prg() 组件 - 如果传递它不喜欢它$this->request->data,但没有模型别名作为嵌套数据集...请参阅CakeDC/search 上的此 PR #200

这是一个可能的重构开始,调试可以帮助您:

<?php
/**
* Search subquery for CompetencesUser
*
* @param array $data input from user, eg: array('competences' => 'First%+Second%, Third%')
* @param array $config filterArgs config for this
* @return string $subquery SQL select to be used as a subquery
*/
public function findByCompetences($data = array(), $config = array()) {

  // just so you know your inputs and where... remove as needed
  $function = 'findByCompetences';
  debug(compact('function', 'data', 'config'));

  // Setup for subquery
  $this->CompetencesUser->Behaviors->attach(
    'Containable', 
    array('autoFields' => false)
  );
  $this->CompetencesUser->Behaviors->attach('Search.Searchable');

  $subqueryOptions = array(
    'fields' => array('user_id'),
    'contain' => array('Competence'),
    // these conditions are created by CompetencesUser->filterArgs
    //   want to customize what you send them?  manipulate or recreate $data
    // ?error here?  check filterArgs on CompetencesUser
    'conditions' => $this->CompetencesUser->parseCriteria($data),
  );

  // just so you know your the find options... remove as needed
  debug(compact('function', 'subqueryOptions'));

  $subquery = $this->CompetencesUser->getQuery('all', $subqueryOptions);

  // just so you know your output... remove as needed
  debug(compact('function', 'subquery'));

  return $subquery;
}
于 2015-08-19T03:52:10.480 回答