sql запрос возвращает пустой array

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

sql запрос возвращает пустой array

Сообщение Alex@ »

Здравствуйте, есть форма фильтрация с подгружаемыми полями, но столкнулся с проблемой, что sql запрос обрабатывается неверно.

есть форма (приведу её часть):

Код: Выделить всё

<div class="row">
    <div class="col-lg-4 col-md-4">
        <?= $form->field($search, 'diameter',[
            'options' => ['class' => 'form-group']])
            ->dropDownList($search->getListDiameter(),[
                'prompt' => 'Любой',
                'id'     => 'diameter'
            ])
            ->label('Диаметр');
        ?>
    </div>
    <div class="col-lg-1 col-md-1">
        ......
    </div>
    <div class="col-lg-7 col-md-7 pull-left">
        ......
    </div>
</div>
<div class="row">
    <div class="col-lg-4 col-md-4">
        <?= $form->field($search, 'width',[
            'options' => ['class' => 'form-group']])
            ->dropDownList($search->getListWidth(),[
                'prompt' => 'Любая',
                'id'     => 'width'
            ])
            ->label('Ширина');
        ?>
    </div>
    <div class="col-lg-1 col-md-1 pull-left">
        ......
    </div>
    <div class="col-lg-2 col-md-2 pull-left">
        ......
    </div>
</div>
<div class="row">
    <div class="col-lg-4 col-md-4">
        <?= $form->field($search, 'dia',[
            'options' => ['class' => 'form-group']])
            ->dropDownList($search->getListDia(),[
                'prompt' => 'Любая',
                'id'     => 'dia'
            ])
            ->label('Диаметр ступицы (DIA)');
        ?>
    </div>
    <div class="col-lg-1 col-md-1 pull-left">
        ......
    </div>
    <div class="col-lg-2 col-md-2 pull-left">
        ......
    </div>
</div>
js код:

Код: Выделить всё

function loadDiameter() {
    var diameter     = $('#diameter');
    var width        = $('#width');
    var dia          = $('#dia');
    var diameterV     = diameter.val();
    $.getJSON('/disc/load-diameter', {
            diameter:diameter.val(),
            width:width.val(),
            dia:dia.val(),
        },
        function(data){
            diameter.html('');
            diameter.append('<option value="">Любой</option>');
            $.each(data, function(i){
                if(parseFloat(this.key) === parseFloat(diameterV)){
                    diameter.append('<option value="' + this.key + '" selected>' + this.value + '</option>');
                }
                else{
                    diameter.append('<option value="' + this.key + '">' + this.value + '</option>');
                }
            });
            diameter.prop('disabled', false);
            diameter.trigger('refresh');
        });
}

function loadWidth() {
    var diameter     = $('#diameter');
    var width        = $('#width');
    var dia          = $('#dia');
    var widthV        = width.val();
    $.getJSON('/disc/load-width', {
            diameter:diameter.val(),
            width:width.val(),
            dia:dia.val()
        },
        function(data){
            width.html('');
            width.append('<option value="">Любая</option>');
            $.each(data, function(i){
                if(parseFloat(this.key) === parseFloat(widthV)){
                    width.append('<option value="' + this.key + '" selected>' + this.value + '</option>');
                }
                else{
                    width.append('<option value="' + this.key + '">' + this.value + '</option>');
                }
            });
            width.prop('disabled', false);
            width.trigger('refresh');
        });
}

function loadDia() {
    var diameter     = $('#diameter');
    var width        = $('#width');
    var dia          = $('#dia');
    var diaV          = dia.val();
    $.getJSON('/disc/load-dia', {
            diameter:diameter.val(),
            width:width.val(),
            pcd:pcd.val(),
            dia:dia.val()
        },
        function(data){
            dia.html('');
            dia.append('<option value="">Любая</option>');
            $.each(data, function(i){
                if(parseFloat(this.key) === parseFloat(diaV)){
                    dia.append('<option value="' + this.key + '" selected>' + this.value + '</option>');
                }
                else{
                    dia.append('<option value="' + this.key + '">' + this.value + '</option>');
                }
            });
            dia.prop('disabled', false);
            dia.trigger('refresh');
        });
}
$('#diameter').change(function() {
    loadWidth();
    loadDia();
});

$('#width').change(function() {
    loadDiameter();
    loadDia();
});

$('#dia').change(function() {
    loadDiameter();
    loadWidth();
});
в контроллере :

Код: Выделить всё

public function actionLoadDiameter()
    {
        $search = new ModelDisc(Yii::$app->request->get());
        $search->setListDiameter($search->generalCfg());
        $result = [];
        foreach ($search->getListDiameter() as $k => $v){
            $result[] = ['key' => $k,'value' => $v];
        }
        return Json::encode($result);
    }

    public function actionLoadWidth()
    {
        $search = new ModelDisc(Yii::$app->request->get());
        $search->setListWidth($search->generalCfg());
        $result = [];
        foreach ($search->getListWidth() as $k => $v){
            $result[] = ['key' => $k,'value' => $v];
        }
        return Json::encode($result);
    }

    public function actionLoadDia()
    {
        $search = new ModelDisc(Yii::$app->request->get());
        $search->setListDia($search->generalCfg());
        $result = [];
        foreach ($search->getListDia() as $k => $v){
            $result[] = ['key' => $k,'value' => $v];
        }
        return Json::encode($result);
    }
коды функция setList..... однообразные, меняется только select('filad'):

Код: Выделить всё

public function setListDia($cfg,$sort = SORT_DESC)
    {
        unset($cfg['dia']);
            $models = ProductDisk::find()
                ->select('dia')
                ->distinct()
                ->where($cfg)
                ->orderBy(['dia' => $sort])
                ->all();
        $result = [];
        foreach ($models as $model) {
            if ($model->dia !== null && $model->dia !== '') {
                $result[(string)$model->dia] = $model->dia;
            }
        }
        $this->_listDia = $result;
    }
подгрузка диаметра и ширины происходит без проблем, но вот когда выбираю из списка Диаметр ступицы (DIA) - там могут быть значения с плавающей точкой, то по диаметру и ширине возвращается пустой массив, хотя при прямом запросе к MySQL через phpAdmin значения в таблице находсять и по диаметру и по ширине.
вот запросы которые происходят:

Код: Выделить всё

SELECT DISTINCT `diameter` FROM `tbl_product_disk` WHERE (`width`=9) AND (`pcd`=135) AND (`dia`=106.3) ORDER BY `diameter` DESC
или

Код: Выделить всё

SELECT DISTINCT `width` FROM `tbl_product_disk` WHERE (`diameter`=20) AND (`pcd`=135) AND (`dia`=106.3) ORDER BY `width` DESC
в чем может быть проблема, не могу понять уже второй день сижу помогите пожалуйста.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: sql запрос возвращает пустой array

Сообщение azz »

там могут быть значения с плавающей точкой
Первое правило float - не используй float, нигде и никогда :)
http://www.mysql.ru/docs/man/Problems_with_float.html
Ответить