如何使用可包含的行为在第三级实现搜索

时间:2010-09-03 06:51:56

标签: search jqgrid cakephp-1.3 containable

我开发了一个蛋糕php应用程序。

此处有学生,展示位置,批次,公司等表格

在展示位置表中有student_id,company_id,在学生表中有batch_id列。

在展示位置索引页面中,我已经应用了jq网格。这是屏幕截图。 alt text

我想搜索学生,公司和批次。为此,我在展示位置控制器索引函数中使用了可容纳的行为。

            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
            ));
        }

使用学生姓名,公司名称和批次名称(如果是大小写)填充网格。 如果我按学生姓名&amp ;;搜索,搜索工作也正常。公司名称,但当我尝试按批次名称搜索时,我收到以下错误:

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 

我认为学生和学生之间的关系;从查询中可以看出批处理不起作用。

我无法弄清楚为什么会这样。

请帮我解决这个问题。

由于

1 个答案:

答案 0 :(得分:1)

可包含行为不会进行连接,但会对每个表进行单独查询。

使用 linkable plugin 。这是一个很棒的插件。它肯定会解决你的问题。

答案先生。 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
            ));
相关问题