Cakephp Multiple Table 搜索容器行为

Cakephp Multiple Table search in container behaviour

你好,我想使用用户输入的关键字从多个 table 中获取结果。我遇到的问题是我不知道如何搜索正在通过 contain

的 table

这是我的查询

public function getGigPostBasedOnSearch($keyword){
        $this->Behaviors->attach('Containable');
        return $this->find('all', array(

            'contain' => array(
              'User','UserInfo', 'GigPostAndCategory.Category','Location','GigPostAndCalender'

            ),
              'conditions' => array(
                  'AND' => array( 
                      'GigPost.active' => 1,
               'OR' => array(

            array('GigPost.title LIKE' => '%'.$keyword.'%'),
            array('GigPost.description LIKE' => '%'.$keyword.'%'),
            array('Location.location_string LIKE' => '%'.$keyword.'%'),


        )
)
                 //'OrderGigPost.request' => 0
            ),
            'order' => 'GigPost.gig_post_id DESC',

            'recursive' => 0
        ));
    }

这个查询工作正常。我想在类别 table 中搜索关键字 also.I 想做这样的事情

array('Category.cat_name LIKE' => '%'.$keyword.'%')

请帮助我如何在类别 table 中也进行搜索

谢谢

型号GigPost.php

<?php



class GigPost extends AppModel
{
    public $useTable = 'gig_post';
    public $primaryKey = 'gig_post_id';

public $hasAndBelongsToMany = array(
'Category' =>
array(
'className' => 'Category',
'joinTable' => 'gigpost_category',
'foreignKey' => 'gig_post_id',
'associationForeignKey' => 'cat_id',
'unique' => true,
)
);
    public $hasOne = array(
        'Location' => array(
            'className'     => 'Location',
            'foreignKey'    => 'gig_post_id',
            'conditions' => array('GigPost.gig_post_id = Location.gig_post_id')
        ));


    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'fields' => array('User.user_id','User.email','User.active')

        ),
        'UserInfo' => array(
            'className' => 'UserInfo',
            'foreignKey' => 'user_id',


        )

    );







    public function getGigPostBasedOnSearch($keyword){
        $this->Behaviors->attach('Containable');
        return $this->find('all', array(

            'contain' => array(
                'User','UserInfo', 'GigPostAndCategory.Category'=>array(
                    'conditions'=>array(

                        'OR' => array(

                            array('Category.cat_name' => '%'.$keyword.'%'),
                        ),


                    )
                ),'Location','GigPostAndCalender'

            ),
            'conditions' => array(
                'AND' => array(
                    'GigPost.active' => 1,
                    'OR' => array(


                        array('GigPost.title LIKE' => '%'.$keyword.'%'),
            array('GigPost.description LIKE' => '%'.$keyword.'%'),
            array('Location.location_string LIKE' => '%'.$keyword.'%'),
           // array('Category.cat_name LIKE' => '%'.$keyword.'%'),


        )
)
                 //'OrderGigPost.request' => 0
            ),
            'order' => 'GigPost.gig_post_id DESC',

            'recursive' => 0
        ));
    }




}

你的问题是GigPostCategory之间的关系是HABTM,所以当你使用contain时,Cake必须做一个单独的查询来检索相关的类别,因为有不是一对一的关联。要解决这个问题,您需要手动执行连接而不是 contain 类别:-

$this->find('all', array(
    'contain' => array(
        'User', 'UserInfo', 'GigPostAndCategory.Category', 'Location', 'GigPostAndCalender'
    ),
    'joins' => array(
        array(
            'table' => 'gigpost_category',
            'alias' => 'GigPostCategory',
            'type' => 'INNER',
            'conditions' => 'GigPost.id = GigPostCategory.gig_post_id'
        ),
        array(
            'table' => 'categories',
            'alias' => 'Category',
            'type' => 'INNER',
            'conditions' => 'Category.id = GigPostCategory.cat_id'
        )
    ),
    'conditions' => array(
        'AND' => array( 
            'GigPost.active' => 1,
            'OR' => array(
                array('GigPost.title LIKE' => '%'.$keyword.'%'),
                array('GigPost.description LIKE' => '%'.$keyword.'%'),
                array('Location.location_string LIKE' => '%'.$keyword.'%'),
                array('Category.cat_name LIKE' => '%'.$keyword.'%'),
            )
        )
    ),
    'order' => 'GigPost.gig_post_id DESC',
    'group' => 'GigPost.id',
    'recursive' => 0
));

这确保类别将包含在主查询返回的数据中。

您可能需要稍微修改 joins 数组,因为您似乎没有为您的 table 使用 Cake 命名约定,所以我不确定您命名的内容。但是,这应该会让您走上正轨。