如何使用可遏制行为在第三级实现搜索

发布于 2024-09-17 17:04:59 字数 3603 浏览 4 评论 0 原文

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

其中有学生、展示位置、批次、公司等表

。展示位置表中有学生 ID、公司 ID,学生表中有批次 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 

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

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

请帮我解决这个问题。

谢谢

I have developed a cake php application.

In this there are tables like students,placements,batches,companies

In placements table there is student_id,company_id and in students table there is batch_id column.

In placements index page i have applied jq grid. Here is the screen shot.
alt text

I want to give searching on student,company and batch. For this i have used containable behavior inside placements controller index function.

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

The grid is populated fine with student name , company name and batch name (if case).
Searching is also working fine in case i searched by student name & company name but when i tried to search by batch name i get the following error:

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 

I think the relation between student & batch is not working as can be seen from the query.

I am unable to figure out why it is behaving as such.

Please help me on this.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

抱猫软卧 2024-09-24 17:04:59

Containable 行为不会进行联接,而是对每个表进行单独的查询。

使用可链接插件。这是一个优秀的插件。它一定会解决你的问题。

先生发布的答案sytzeloorcakeqs 网站。

使用此插件,您将能够根据批次名称轻松地在放置模型中执行查找操作。

在你的展示位置控制器中这样做,我打赌你会得到预期的结果。

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

The Containable behavior doesn't make a join, but makes separate queries for each table.

Use the linkable plugin. It's an excellent plugin. It will definitely solve your problem.

Answer posted by Mr. sytzeloor on cakeqs site.

Using this plugin you will be able to easily do a find operation in the placement model based on a batch name.

Do like this in your placements controller and I bet you will get results as expected.

$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
            ));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文