Cakephp,SQL编写的语句没有返回正确的结果

时间:2011-08-10 20:23:22

标签: php mysql sql database cakephp

好的,所以我对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语句吗?

1 个答案:

答案 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,但这可能有点复杂的最小值和最大值。