Как мне реализовать поиск на третьем уровне, используя сдерживаемое поведение - PullRequest
1 голос
/ 03 сентября 2010

Я разработал 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
            ));
        }

Сетка заполнена в порядке с именем студента, названием компании и названием партии (если это так). Поиск также работает нормально, если я выполнял поиск по имени студента и названию компании, но когда я пытался выполнить поиск по названию партии, я получаю следующую ошибку:

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 Ответ

1 голос
/ 03 сентября 2010

Поведение 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
            ));
...