搜索在cakepp-3中不起作用



我想通过搜索输入从数据库中搜索我的数据,一切看起来都很好,但我找不到为什么这个代码不起作用。当我在输入框中输入搜索数据时,任何事情都完成了。请帮助

我的控制器:AdUnitsController

 class AdUnitsController extends AppController

public function index()
{
    $query = $this->_getData();
    $this->set('adUnits', $this->paginate($query));
    $this->paginate = [
        'contain' => ['Networks', 'Games', 'AdTypes']
    ];
    $adUnits = $this->paginate($this->AdUnits);
    $this->set(compact('adUnits'));
    $this->set('_serialize', ['adUnits']);
}
public function _getData()
{
    if (!empty($this->request->data['search'])) {
        $search = $this->request->data['search'];
        $query = $this->AdUnits->find('All')->where([
            'OR' => [
                ['name LIKE' => '%' . $search . '%'],
            ],
        ]);
    }
    else{
        $query = $this->AdUnits->find('All');
    }
    return $query;
}

我的视图index.ctp:

        <label> Search</label>
        <?php echo $this->Form->create('AdUnits',array('id' => 'site-search','url'=>array('action'=>'index')));?>
        <div>
            <?php echo $this->Form->input('search',array('class' => 'form-control', 'label' =>false, 'placeholder' => 'Type Network')); ?>
        </div>
        <div> <button type="submit"> Search</button>
            <?php echo $this->Form->end();?>

搜索不起作用。请帮助

首先简化您的代码:您正在进行两次无理由的分页

public function index()
{
    $this->paginate = [
        'contain' => ['Networks', 'Games', 'AdTypes']
    ];
    $query = $this->_getData();
    $this->set('adUnits', $this->paginate($query));
} 

如果您仍然面临问题,那么您的查询可能有错误。我的猜测是name列是模糊的,所以在您的find()调用中这样做

['AdUnits.name LIKE' => '%' . $search . '%']

作为附带说明,我建议您阅读文档,特别是学习如何调试代码。

另外,在我看来,_getData方法应该移动到模型或组件中。

public function index()
{
    $query = $this->_getData();
    $this->set('adUnits', $this->paginate($query));
    $this->paginate = [
        'contain' => ['Networks', 'Games', 'AdTypes']
    ];
    $adUnits = $this->paginate($this->AdUnits);
    $this->set(compact('adUnits'));
    $this->set('_serialize', ['adUnits']);
}

更换为

    public function index()
{
    $this->paginate = [
        'contain' => ['Networks', 'Games', 'AdTypes']
    ];
    $query = $this->_getData();
    $this->set('adUnits', $this->paginate($query));
}

最新更新