cakedc search:when i use wildcards and and/or connectors i have this Error: Invalid argument supplied for foreach()
cakedc search:when i use wildcards and and/or connectors i have this Error: Invalid argument supplied for foreach()
我想按权限搜索例如 $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;
}
我怀疑您的问题可能在于:
- 名称
competences
的 CompetencesUser
模型中的 filterArgs
,您尚未包含...正在处理以创建您拥有的 $result
以上。
- 公共进程 prg() 组件 - 如果
$this->request->data
被传递,它不喜欢它,但没有模型别名作为嵌套数据集...见 this PR #200 on CakeDC/search
这是一个可能的重构开始,调试可以帮助您解决问题:
<?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;
}
我想按权限搜索例如 $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;
}
我怀疑您的问题可能在于:
- 名称
competences
的CompetencesUser
模型中的filterArgs
,您尚未包含...正在处理以创建您拥有的$result
以上。 - 公共进程 prg() 组件 - 如果
$this->request->data
被传递,它不喜欢它,但没有模型别名作为嵌套数据集...见 this PR #200 on CakeDC/search
这是一个可能的重构开始,调试可以帮助您解决问题:
<?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;
}