0

好的,案例如下:

有一个表单有一些下拉菜单和多个选择字段。

现在一切都很好,除了我必须按属性类型搜索是和/或不仅或对于表格的其余部分(或至少我相信它是或其余部分)。

即属性类型 1 && 属性类型 2 && (子类型 1 || sybtype 2 || sybtype 3)

另一件事是,选择所有子类型时,所示的结果应与选择不相同。

我真的不知道在哪里阅读或查看有关此插件提供的有关“和”搜索的搜索功能的更详细教程。

我的模型中有以下内容:

    public $filterArgs = array(
        //array('name' => 'price', 'type' => 'query', 'method' => 'filterTitle'),
        array('name' => 'province_id', 'type' => 'value'),
        array('name' => 'city_id', 'type' => 'value'),
        array('name' => 'quarter_id', 'type' => 'value'),
        array('name' => 'refid', 'type' => 'value'),
        array('name' => 'to', 'type' => 'value'),
        array('name' => 'price1', 'name2' => 'price2', 'type' => 'expression', 'method' => 'priceRange', 'field' => 'Offer.price BETWEEN ? AND ?'),
        array('name' => 'area1', 'name2' => 'area2', 'type' => 'expression', 'method' => 'areaRange', 'field' => 'Offer.area BETWEEN ? AND ?'),
        array('name' => 'type_id', 'type' => 'query', 'method' => 'ManyOrConditions'),
        array('name' => 'subtype_id', 'type' => 'query', 'method' => 'ManyOrConditions'),
        array('name' => 'feature_id', 'type' => 'subquery', 'method' => 'findByTags1', 'field' => 'Offer.id'),
    );

   public function ManyOrConditions($data = array()) {
        //debug($data);
        $filter = $data['type_id'];
        //not sure if this works
        //$subtype = $data['subtype_id'];

        $cond = array(
            'OR' => array(
                $this->alias . '.type_id ' => $filter,
                //not sure if the below will work?
                //$this->alias . '.subtype_id ' => $subtype
        ));
        //debug($cond);
        return $cond;
    }

    public function orConditions($data = array()) {
        //debug($data);
        $filter = $data['type_id'];
        $cond = array(
            'OR' => array(
                $this->alias . '.type_id LIKE' => '%' . $filter . '%',
            //$this->alias . '.body LIKE' => '%' . $filter . '%',
        ));
        return $cond;
    }

据我了解,它只为 type_id 创建“或”搜索......对不起,伙计们真的迷失了。

我是 cakephp 的新手,到目前为止,我已经能够阅读数千行代码并对这个系统进行大量更改,但是由于缺少关于这个插件的文档,我不知道该怎么做:(

我将不胜感激对教程和/或适当文档的任何指导——不是这个https://github.com/CakeDC/search

如果这是正确的,请让我知道我缺少什么。

PS如果您在这里需要任何其他代码,请告诉我,我会提供。

4

3 回答 3

0

AND 条件或任何其他自定义查询/条件将与 orConditions 完全相同。它只是一个回调方法,您可以在其中做任何您想做的事情来构建您需要的任何类型的查询。

查看“复杂”条件如何工作:http ://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

array(
    'OR' => array(
        array('Company.name' => 'Future Holdings'),
        array('Company.city' => 'CA')
    ),
    'AND' => array(
        array(
            'OR' => array(
                array('Company.status' => 'active'),
                'NOT' => array(
                    array('Company.status' => array('inactive', 'suspended'))
                )
            )
        )
    )
)

只需创建一个自定义方法“myCustomAnd”并使用传递给该方法的 $data 将您需要的任何查询放入其中。

该插件附带了一个完整的示例,我认为它的文档记录并不好。恕我直言,您需要做什么很明显。

于 2013-07-02T10:37:53.020 回答
0

非常感谢您的指导 burzum。我终于明白了。这是我的做法:

    public function andTypeConditions($data = array()){

        //The below two variables contain the data received by the submission of the form
        $typeID = $data['type_id'];
        $subTypeID = $data['subtype_id'];
        //Define a variable $conditions to return. The conditions you can build according CakePHP manual for complex find conditions        
        if (isset($data['subtype_id'])) {
            $conditions = array(
                'Offer.type_id' => $typeID,
                'Offer.subtype_id' => $subTypeID
            );            
        }  else {
            $conditions = array(
                'Offer.type_id' => $typeID
            );
        }

        return $conditions;
    }

对于任何遇到相同问题的人,请澄清:

为了在 cakeDC 搜索插件中进行“AND”搜索,您需要创建一个方法,稍后您将分配给两个(在我的情况下为两个,但如果您有更多,则为所有)字段,如下所示:

public $filterArgs = array(
    array('name' => 'type_id', 'type' => 'query', 'method' => 'andTypeConditions'),
    array('name' => 'subtype_id', 'type' => 'query', 'method' => 'andTypeConditions'),
);

...该方法本身包含您需要能够根据需要对其进行调整的注释。

于 2013-07-02T19:04:19.723 回答
0

这是我最终为更复杂的搜索所做的。使用 CakeDC 搜索插件...这使用“LIKE OR”而不是“LIKE AND”,但希望它能够阐明如何使用 Search 插件进行更复杂的搜索。

User.search 是我提交表单中的输入元素名称。

class User extends AppModel {
    public $filterArgs = array(
        'search' => array('type' => 'like', 'field' => array('User.name', 'User.email'))
    }
}

class UsersController extends AppController {
    public $components = array('Search.Prg');

    public function index() {
        $this->Prg->commonProcess();

        $this->User->data['User'] = $this->passedArgs;

        if ($this->User->Behaviors->loaded('Searchable')) {
           $query = $this->passedArgs;
           $parsedConditions = $this->User->parseCriteria($query);
       } else {
           $parsedConditions = array();
       }

       $this->Paginator->settings['User']['conditions'] = $parsedConditions;

       $this->set('users', $this->Paginator->paginate());
    }
}
于 2014-09-24T22:31:39.527 回答