好吧,所以我是我相當新cakephp,我有一個搜索表單與多個字段,我有一些在搜索表單中可選的字段。我想要做的是當表單被提交時,檢查是否這些字段不是NULL並將它們應用到我的find('all')查詢中。Cakephp,SQL準備語句不返回正確的結果
這是我的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')); ?>
即標題選項字段集是可選字段 設置爲一個數組,其初始值是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 table WHERE column_name AND column_name等。但是,將NULL值傳遞給數據庫將(1)不返回結果或(2)返回錯誤的結果。我已經在控制器中用OR語句嘗試了許多不同的方法,但是OR是泛化的並返回許多結果。
有沒有一種方法可以通過beforeFind()函數來修改控制器或我的模型中的SQL語句(beforeFind超出我的知識範圍,並且很難找到它正在使用的實例),或者我最好檢查值並修改Model __construct()函數中的SQL語句?
所以..你在你的選擇框中有NULL值?生成的SQL查詢是什麼? –
生成的查詢是SELECT * FROM mls_cvrmls WHERE column_name AND column_name AND column_name etc ..是的,我在我的選擇框中有NULL值。 –
輸入始終以回發形式發佈(除非它們被禁用),並且您總是獲取一個字符串。你永遠不會返回NULL。 (注意:複選框只在被選中時被髮布,單選按鈕被選中時,會顯示單選按鈕,該值顯示哪個單選按鈕被選中。) – Arjan