2011-08-10 124 views
0

好吧,所以我是我相當新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語句?

+0

所以..你在你的選擇框中有NULL值?生成的SQL查詢是什麼? –

+0

生成的查詢是SELECT * FROM mls_cvrmls WHERE column_name AND column_name AND column_name etc ..是的,我在我的選擇框中有NULL值。 –

+0

輸入始終以回發形式發佈(除非它們被禁用),並且您總是獲取一個字符串。你永遠不會返回NULL。 (注意:複選框只在被選中時被髮布,單選按鈕被選中時,會顯示單選按鈕,該值顯示哪個單選按鈕被選中。) – Arjan

回答

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']; 
} 

我敢肯定,你可以看到我在做什麼,你應該能夠完成其他params。然後,您可以將$conditions分配給find函數調用中的條件鍵。

$listings = $this->Idx->find('all', array(
    'conditions' => $conditions 
)); 

我認爲分配在一個循環中$condtions,但可能是有點複雜與最小值和最大值。

+0

作品感謝,我想過把數組傳遞給條件也是,但我正在考慮將值推向數組。 –