关键字的CakePHP查询不返回结果
我正在为我的网站建立一个基本目录。我希望我的用户能够通过数据的三个不同方面搜索条目。关键字(关键字的CakePHP查询不返回结果,php,database,cakephp,Php,Database,Cakephp,我正在为我的网站建立一个基本目录。我希望我的用户能够通过数据的三个不同方面搜索条目。关键字($keyword)、状态($state)和公司类型($service\u id)。我可以获取$service\u id和$state以返回正确的结果,因为它们是带有固定数据的下拉列表。问题是$关键字。如果只使用一个字母,$keyword将返回一些内容。但当这封信可能出现在几乎所有的列表中时,它只会返回一个列表 这是我的DirectoryController.php文件: <?php // src/C
$keyword
)、状态($state
)和公司类型($service\u id
)。我可以获取$service\u id
和$state
以返回正确的结果,因为它们是带有固定数据的下拉列表。问题是$关键字
。如果只使用一个字母,$keyword
将返回一些内容。但当这封信可能出现在几乎所有的列表中时,它只会返回一个列表
这是我的DirectoryController.php文件:
<?php
// src/Controller/DirectoryController.php
namespace App\Controller;
use Cake\Network\Exception\NotFoundException;
class DirectoryController extends AppController {
public function initialize()
{
parent::initialize();
global $state_ids;
if(PREFIX == 'ne') {
$state_ids = array(
'CT' => "Connecticut",
'ME' => "Maine",
'MA' => "Massachusetts",
'NH' => "New Hampshire",
'RI' => "Rhode Island",
'VT' => "Vermont"
);
} else {
$state_ids = array(
'UPS' => "Upstate New York",
'NYC' => "New York City",
'LI' => "Long Island"
);
}
global $service_ids;
$service_ids = array(
'1'=>"Auctions",
'2'=>"Brokers",
'3'=>"Building Services",
'4'=>"Construction",
'5'=>"Design Build",
'6'=>"Economic Development",
'7'=>"Finance",
'8'=>"Professional Services",
'9'=>"Sub Contractors"
);
}
public function index() {
$this->load_ads();
$this->set('title_for_layout', 'Directory');
$this->loadModel('Directory');
$captcha_int = 6;
if (!empty($this->request->query('keyword')) && $this->request->query('captcha') == $captcha_int) {
$keyword = $this->request->query('keyword');
} else {
$keyword = '';
}
$this->set('keyword', $keyword);
if(is_array($this->request->query('service_ids')) && $this->request->query('captcha') == $captcha_int) {
//Service array
$cat_array_services = $this->request->query('service_ids');
$cat_final_services = implode(',', $cat_array_services);
$service = $cat_final_services;
$selected_service_ids = explode(',', $service);
} else {
$selected_service_ids = '';
$service = $this->request->query('service_ids');
}
$this->set('selected_service_ids', $selected_service_ids);
if(is_array($this->request->query('service_ids')) && $this->request->query('captcha') == $captcha_int) {
//State array
$cat_array_states = $this->request->query('state_ids');
$cat_final_states = implode(',', $cat_array_states);
$state = $cat_final_states;
$selected_state_ids = explode(',', $state);
$this->set('selected_state_ids', $selected_state_ids);
} else {
$selected_state_ids = '';
$state = $this->request->query('state_ids');
}
$this->set('selected_state_ids', $selected_state_ids);
$service_ids = $GLOBALS['service_ids'];
$this->set(compact('service_ids'));
$services_sidebar = '';
foreach($service_ids as $key => $value) {
$count = $this->services_count($key);
$services_sidebar[] = ['id' => $key, 'title' => $value, 'count' => $count];
}
$this->set('services_sidebar', $services_sidebar);
$state_ids = $GLOBALS['state_ids'];
$this->set(compact('state_ids'));
if(empty($service) & empty($state)) {
$directory_items = $this->Directory->find('all')->where([
['Directory.title LIKE' => "%".$keyword."%"],
['Directory.body LIKE' => "%".$keyword."%"],
['Directory.address LIKE' => "%".$keyword."%"],
['Directory.phone LIKE' => "%".$keyword."%"],
['Directory.website LIKE' => "%".$keyword."%"],
])->order(['logo' => 'DESC']);
} elseif(empty($keyword) & empty($state)) {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.service_ids LIKE' => "%".$service."%"]
]
])->order(['logo' => 'DESC']);
} elseif(empty($keyword) & empty($service)) {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.state_ids LIKE' => "%".$state."%"]
]
])->order(['logo' => 'DESC']);
} elseif(empty($state)) {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.title LIKE' => "%".$keyword."%"],
['Directory.body LIKE' => "%".$keyword."%"],
['Directory.address LIKE' => "%".$keyword."%"],
['Directory.phone LIKE' => "%".$keyword."%"],
['Directory.website LIKE' => "%".$keyword."%"],
['Directory.service_ids LIKE' => "%".$service."%"]
]
])->order(['logo' => 'DESC']);
} elseif(empty($service)) {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.title LIKE' => "%".$keyword."%"],
['Directory.body LIKE' => "%".$keyword."%"],
['Directory.address LIKE' => "%".$keyword."%"],
['Directory.phone LIKE' => "%".$keyword."%"],
['Directory.website LIKE' => "%".$keyword."%"],
['Directory.state_ids LIKE' => "%".$state."%"]
]
])->order(['logo' => 'DESC']);
} elseif(empty($keyword)) {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.service_ids LIKE' => "%".$service."%"],
['Directory.state_ids LIKE' => "%".$state."%"]
]
])->order(['logo' => 'DESC']);
} else {
$directory_items = $this->Directory->find('all')->where([
'OR' => [
['Directory.title LIKE' => "%".$keyword."%"],
['Directory.body LIKE' => "%".$keyword."%"],
['Directory.address LIKE' => "%".$keyword."%"],
['Directory.phone LIKE' => "%".$keyword."%"],
['Directory.website LIKE' => "%".$keyword."%"],
['Directory.service_ids LIKE' => "%".$service."%"],
['Directory.state_ids LIKE' => "%".$state."%"]
]
])->order(['logo' => 'DESC']);
}
$directory_list = $this->paginate($directory_items);
$this->set(compact('directory_list'));
}
public function view($slug = NULL) {
$this->load_ads();
$this->loadModel('Directory');
$directory = $this->Directory->find('all')->where(['Directory.slug' => $slug])->first();
$this->set('title_for_layout', $directory->title);
if (empty($directory)) {
throw new NotFoundException('Could not find that directory listing.');
}
$this->set('directory', $directory);
$this->loadModel('Story');
$directory_stories = $this->Story->find('all')->where(['Story.body LIKE' => '%'.htmlspecialchars($directory->title).'%', 'remove_from_directory' => 0])->limit(5)->order(['id' => 'DESC']);
$this->set('directory_stories', $directory_stories);
}
public function services_count($service_id) {
$services = $this->Directory->find('all')->where(['Directory.service_ids LIKE' => '%'.$service_id.'%']);
$services_count = $services->count();
return $services_count;
}
为了感谢@ndm,他注意到我需要在我的第一组条件中添加一个
或。碰巧是$keyword
变量没有返回任何结果。您可能应该稍微清理一下这种情况,这是相当多的重复。检查生成的SQL,例如,您的一个路径不使用或来处理类似的条件。@ndm就是这样,它可以工作!我知道,这有点多余。一般来说,php还是新手。一旦我学到更多,我可能会在我的身体状况上投入更多的时间。现在我真的只是想让它发挥作用。谢谢你的帮助。
<h1 class="page-header">Directory</h1>
<div class="panel panel-default intro_box">
<div class="panel-body">
Welcome to the Directory.
</div>
</div>
<div class="row">
<div class="col-sm-8">
<?php
echo $this->Form->create('', array('type' => 'get', 'enctype'=>'multipart/form-data'));
echo '<div class="form-group">';
echo $this->Form->input('keyword', array('class' => 'form-control', 'type' => 'text', 'placeholder' => 'Please enter a keyword...', 'value' => $keyword));
echo '</div>';
echo '<div class="form-group">';
echo $this->Form->input('service_ids', array('class' => 'form-control', 'id' => 'service_ids', 'label' => 'Service', 'empty' => 'Please choose', 'options' => $service_ids));
echo '</div>';
echo '<div class="form-group">';
echo $this->Form->input('state_ids', array('class' => 'form-control', 'id' => 'state_ids', 'label' => 'State', 'empty' => 'Please choose', 'options' => $state_ids));
echo '</div>';
echo '<div class="form-group">';
echo '<div class="row">';
echo '<div class="col-md-8">';
echo $this->Form->input('captcha', array('class' => 'form-control', 'type' => 'text', 'placeholder' => 'CAPTCHA', 'required' => true));
echo '</div>';
echo '<div class="col-md-4">';
echo '<br /><p>+ 5 = 11</p>';
echo '</div>';
echo '</div>';
echo '</div>';
echo $this->Form->submit('Submit', array('class' => 'btn btn-primary'));
echo $this->Form->end();
?>
</div>
<div class="col-sm-4">
<?php
echo '<div class="list-group">';
foreach($services_sidebar as $service) {
echo '<a class="list-group-item" href="'.BASE_URL.'/directory?service_ids='.$service['id'].'">'.$service['title'].' <span class="badge">'.$service['count'].'</span>
</a>';
}
echo '</div>';
?>
</div>
</div>
<br />
<br />
<div class="table-responsive">
<table class="table table-striped table-hover">
<tbody>
<?php foreach($directory_list as $directory_item) {
echo '<tr>';
echo '<td>';
if(!empty($directory_item->logo)) {
echo '<a href="'.BASE_URL.'/directory/'.$directory_item->slug.'">';
echo '<img class="img-responsive center-block" src="'.$directory_item->logo.'"/>';
echo '</a>';
}
$body = substr($directory_item->body,0,50);
echo '<a href="'.BASE_URL.'/directory/'.$directory_item->slug.'">'.$directory_item-
>title.'</a>';
if(!empty($directory_item->address)) {
echo '<div>' . nl2br($directory_item->address) . '</div>';
}
if(!empty($directory_item->address2)) {
echo '<div>' . nl2br($directory_item->address2) . '</div>';
}
echo '<div>'.$body.' <a href="'.BASE_URL.'/directory/'.$directory_item->slug.'">Read More...
</a></div>';
echo '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
</div>
<ul class="pagination">
<?php
echo $this->Paginator->prev(__('prev'), array('tag' => 'li'), null, array('tag' => 'li','class' => 'disabled','disabledTag' => 'a'));
echo $this->Paginator->numbers(array('separator' => '','currentTag' => 'a', 'currentClass' => 'active','tag' => 'li','first' => 1));
echo $this->Paginator->next(__('next'), array('tag' => 'li','currentClass' => 'disabled'), null, array('tag' => 'li','class' => 'disabled','disabledTag' => 'a'));
?>
</ul>