2016年10月24日月曜日

cakephp2におけるHABTM関係要素の検索


ProjectとSkill, AreaはHABTMの関係となっています。Skill, AreaでProjectを検索するには、条件には「joins」を定義してあげないと、SQLがエラーになります。hasOne/hasMany/belongsToなら、不要ですが。

if ($this->request->is('post')) {
            $areas = $this->request['data']['area'];
            $skills = $this->request['data']['Project']['Skill'];
            $industries = $this->request['data']['Project']['Industry'];//IndustryはhasMany Project

            $opt_area = array('OR' => array('Area.id' => $areas));//OR条件検索
            $opt_skill = array('OR' => array('Skill.id' => $skills));
            $opt_industry = array('OR' => array('Industry.id' => $industries));

            $opt = array($opt_area, $opt_skill, $opt_industry);//default AND条件検索

$this->Paginator->settings = array(
                'conditions' => $opt,
                'recursive' => 1,
                'group' => array('Project.id'),
                'joins' => array(
                    array('table' => 'areas_projects',
                        'alias' => 'AreasProject',
                        'type' => 'inner',
                        'conditions' => array(
                            'Project.id = AreasProject.project_id',
                        )
                    ),
                    array(
                        'table' => 'areas',
                        'alias' => 'Area',
                        'type' => 'inner',
                        'conditions' => array(
                            'AreasProject.area_id = Area.id',
                        ),
                    ),
                     array('table' => 'skills_projects',
                         'alias' => 'SkillsProject',
                         'type' => 'inner',
                         'conditions' => array(
                             'Project.id = SkillsProject.project_id',
                         )
                     ),
                    array(
                        'table' => 'skills',
                        'alias' => 'Skill',
                        'type' => 'inner',
                        'conditions' => array(
                            'SkillsProject.skill_id = Skill.id',
                        ),
                    ),

$projects = $this->Paginator->paginate('Project');

0 件のコメント:

コメントを投稿