好的,所以我对cakephp很新,我有一个包含多个字段的搜索表单,并且我在搜索表单中有一些可选的字段。我要做的是在提交表单时,检查这些字段是否为NULL并将其应用于我的find('all')查询。
这是我的ctp视图
<h2>IDX Listings</h2>
<?php echo $this->Form->create('Listing', array('action'=>'results')); ?>
<fieldset><legend>Location Criteria</legend>
<?php echo $this->Form->input('listing_countyid', array('type'=>'select', 'options'=>$counties, 'default'=>'Richmond')); ?>
<?php echo $this->Form->input('listing_area', array('type'=>'select', 'options'=>$areas)); ?>
<?php echo $this->Form->input('listing_neighborhood', array('type'=>'select', 'options'=>$hoods)); ?>
<?php echo $this->Form->input('listing_subdivision', array('type'=>'select')); ?>
</fieldset>
<fieldset><legend>Market</legend>
<?php echo $this->Form->input('min_price', array('type'=>'select', 'options'=>$minPrices)); ?>
<?php echo $this->Form->input('max_price', array('type'=>'select', 'options'=>$maxPrices)); ?>
<?php echo $this->Form->input('listing_yearbuilt', array('type'=>'select', 'options'=>$years, 'label'=>'Built After')); ?>
</fieldset>
<fieldset><legend>Size</legend>
<?php echo $this->Form->input('min_rooms', array('type'=>'select', 'options'=>$minRooms)); ?>
<?php echo $this->Form->input('max_rooms', array('type'=>'select', 'options'=>$maxRooms)); ?>
<?php echo $this->Form->input('min_stories', array('type'=>'select', 'options'=>$stories, 'label'=>'Min Stories')); ?>
<?php echo $this->Form->input('min_listing_sqfttotal', array('type'=>'select', 'options'=>$minSqft, 'label'=> 'Min Sq Ft'));
<?php echo $this->Form->input('max_listing_sqfttotal', array('type'=>'select', 'options'=>$maxSqft, 'label'=> 'Max Sq Ft'));
?>
<?php echo $this->Form->input('min_bathrooms', array('type'=>'select', 'options'=>$minBath, 'label'=>'Min Bathrooms')); ?>
<?php echo $this->Form->input('max_bathrooms', array('type'=>'select', 'options'=>$maxBath, 'label'=>'Max Bathrooms')); ?>
<?php echo $this->Form->input('min_bedrooms', array('type'=>'select', 'options'=>$minBed, 'label'=>'Min Bedrooms')); ?>
<?php echo $this->Form->input('max_bedrooms', array('type'=>'select', 'options'=>$maxBed, 'label'=>'Max Bedrooms')); ?>
</fieldset>
<fieldset><legend>Options</legend>
<?php echo $this->Form->input('heat_type', array('type'=>'select', 'options'=>$heat_type, 'label'=>'Heating System')); ?>
<?php echo $this->Form->input('cool_type', array('type'=>'select', 'options'=>$cool_type, 'label'=>'Cooling System')); ?>
<?php echo $this->Form->input('irrigation_system', array('type'=>'select', 'options'=>$irrigation_system, 'label'=>'Irrigation System')); ?>
<?php echo $this->Form->input('handicap', array('type'=>'select', 'options'=>$handicap, 'label'=>'Handicap Equipped')); ?>
<?php echo $this->Form->input('fireplace', array('type'=>'select', 'options'=>$fireplace, 'label'=>'Fireplace')); ?>
<?php echo $this->Form->input('fence', array('type'=>'select', 'options'=>$fence, 'label'=>'Fenced')); ?>
<?php echo $this->Form->input('level1_mstr', array('type'=>'select', 'options'=>$level1_mstr, 'default'=>'No', 'label'=>'1st Floor Master Bedroom')); ?>
<?php echo $this->Form->input('level1_laundry', array('type'=>'select', 'options'=>$level1_laundry, 'default'=>'No', 'label'=>'1st Floor Laundry Room')); ?>
</fieldset>
<?php echo $this->Form->submit('Search', array('target'=>"SearchResults", 'id'=>'submit')); ?>
标题为“选项”的字段集是可选字段 Optional字段值设置为初始值为NULL的数组
这是我的控制器内的搜索功能
function results() {
if (!empty($this->data)) {
$listings = $this->Idx->find('all', array(
'conditions'=>array(
'listing_countyid' => $this->data['Listing']['listing_countyid'],
'listing_area' => $this->data['Listing']['listing_area'],
'listing_neighborhood' => $this->data['Listing']['listing_neighborhood'],
'listing_listprice >=' => $this->data['Listing']['min_price'],
'listing_listprice <=' => $this->data['Listing']['max_price'],
'listing_rooms >=' => $this->data['Listing']['min_rooms'],
'listing_rooms <=' => $this->data['Listing']['max_rooms'],
'listing_sqfttotal >=' => $this->data['Listing']['min_listing_sqfttotal'],
'listing_sqfttotal <=' => $this->data['Listing']['max_listing_sqfttotal'],
'listing_stories >=' => $this->data['Listing']['min_stories'],
'listing_yearbuilt >=' => $this->data['Listing']['listing_yearbuilt'],
'listing_bathstotal >=' => $this->data['Listing']['min_bathrooms'],
'listing_bathstotal <=' => $this->data['Listing']['max_bathrooms'],
'listing_bedrooms >=' => $this->data['Listing']['min_bedrooms'],
'listing_bedrooms <=' => $this->data['Listing']['max_bedrooms'],
'listing_roommasterbrlevel' => $this->data['Listing']['level1_mstr'],
'listing_roomlaundrylevel' => $this->data['Listing']['level1_laundry'],
'listing_heatsystem' => $this->data['Listing']['heat_type'],
'listing_coolsystem' => $this->data['Listing']['cool_type'],
'listing_irrigationsrc' => $this->data['Listing']['irrigation_system'],
'listing_fireplaces' => $this->data['Listing']['fireplace'],
'listing_handicap' => $this->data['Listing']['handicap'],
'listing_fence' => $this->data['Listing']['fence']
)
));
$this->set('listings', $listings);
}
}
如果我从find()查询中删除选项,则返回的结果是正确的,但是一旦我在视图中设置了值,我就不会返回正确的结果。我知道find()预处理语句背后的SQL语法是SELECT * FROM表WHERE column_name AND column_name等。但是将NULL值传递给数据库将(1)不返回结果或(2)返回错误的结果。我在控制器中尝试了许多不同的方法,使用OR语句,但OR是泛化的并返回许多结果。
有没有办法通过beforeFind()函数在Controller或我的模型中修改SQL语句(beforeFind超出我的知识,很难找到使用它的一个可靠的例子),或者我会最好在模型__construct()函数中检查值并修改SQL语句吗?
答案 0 :(得分:0)
$conditions = array();
// it's a postback, so the key should exist
if($this->data['Listing']['listing_countyid'] !== '')
{
$conditions['listing_countryid'] = $this->data['Listing']['listing_countyid'];
}
if($this->data['Listing']['listing_area'] !== '')
{
$conditions['listing_area'] = $this->data['Listing']['listing_area'];
}
if($this->data['Listing']['listing_neighborhood'] !== '')
{
$conditions['listing_neighborhood'] = $this->data['Listing']['listing_neighborhood'];
}
if($this->data['Listing']['min_price'] !== '')
{
$conditions['listing_listprice >='] = $this->data['Listing']['min_price'];
}
if($this->data['Listing']['max_price'] !== '')
{
$conditions['listing_listprice <='] = $this->data['Listing']['max_price'];
}
我确定你能看到我在做什么,你应该能够为其他参数完成这个。然后,您可以将$conditions
分配给查找函数调用中的条件键。
$listings = $this->Idx->find('all', array(
'conditions' => $conditions
));
我考虑在循环中分配$condtions
,但这可能有点复杂的最小值和最大值。