我开发了一个蛋糕PHP应用程序。
其中有学生、安置、批次、公司等表格
在placements表中有student_id,company_id,在students表中有batch_id列。
在展示位置索引页面中,我应用了 jq 网格。这是屏幕截图。
我想对学生、公司和批次进行搜索。为此,我在布局控制器索引函数中使用了可包含的行为。
if( $this->params['url']['_search'] == 'true' ) /* For Searching*/
{
//pr($this->params);
$searchconditions = array();
if( isset($this->params['url']['studentname']) && !empty($this->params['url']['studentname']) )
{
array_push(&$searchconditions, array('Student.fullname LIKE' => $this->params['url']['studentname'] . '%'));
}
if( isset($this->params['url']['companyname']) && !empty($this->params['url']['companyname']) )
{
array_push(&$searchconditions, array('Company.name LIKE' => $this->params['url']['companyname'] . '%'));
}
if( isset($this->params['url']['batchname']) && !empty($this->params['url']['batchname']) )
{
array_push(&$searchconditions, array('Batch.name LIKE' => $this->params['url']['batchname'] . '%'));
}
$result = $this->Placement->find('all', array(
'fields' => array('id','student_id','company_id'),
'contain' => array(
'Student' => array(
'fields' => array('id','fullname','batch_id'),
'Batch' => array(
'fields'=> array('id','name')
)
),
'Company' => array(
'fields' => array('id','name')
)
),
'conditions' => $searchconditions,
'order' => $sort_range,
'limit' => $limit_range
));
}
else /* Default display*/
{
$result = $this->Placement->find('all', array(
'fields' => array('id','student_id','company_id'),
'contain' => array(
'Student' => array(
'fields' => array('id','fullname','batch_id'),
'Batch' => array(
'fields'=> array('id','name')
)
),
'Company' => array(
'fields' => array('id','name')
)
),
'order' => $sort_range,
'limit' => $limit_range
));
}
网格中填充了学生姓名、公司名称和批次名称(如果有)。 如果我按学生姓名和公司名称搜索,搜索也工作正常,但当我尝试按批次名称搜索时,出现以下错误:
Warning (512): SQL Error: 1054: Unknown column 'Batch.name' in 'where clause' [APP\vendors\cakephp\cake\libs\model\datasources\dbo_source.php, line 681]
Query: SELECT `Placement`.`id`, `Placement`.`student_id`, `Placement`.`company_id`, `Student`.`id`, `Student`.`fullname`, `Student`.`batch_id`, `Company`.`id`, `Company`.`name` FROM `placements` AS `Placement` LEFT JOIN `students` AS `Student` ON (`Placement`.`student_id` = `Student`.`id`) LEFT JOIN `companies` AS `Company` ON (`Placement`.`company_id` = `Company`.`id`) WHERE `Batch`.`name` LIKE 'df%' ORDER BY `Placement`.`id` asc LIMIT 0,10
我认为学生和批次之间的关系不起作用,从查询中可以看出。
我无法弄清楚为什么它会这样。
请帮我解决这个问题。
谢谢
Containable 行为不会进行联接,而是对每个表进行单独的查询。
使用 可链接插件。这是一个优秀的插件。绝对能解决你的问题。
先生发表的答案sytzeloor 在 cakeqs 网站上。
使用此插件,您将能够根据批次名称轻松地在放置模型中执行查找操作。
在您的展示位置控制器中执行此操作,我打赌您会得到预期的结果。
$result = $this->Placement->find('all', array(
'fields' => array('id','student_id','company_id'),
'link' => array(
'Student' => array(
'Batch'
),
'Company'
),
'conditions' => $searchconditions,
'order' => $sort_range,
'limit' => $limit_range
));