CakePHP - сгенерированный запрос не работает правильно с SQL Server - PullRequest
1 голос
/ 10 марта 2010

У меня есть приложение CakePHP, которое переносится на Sql Server из MySql. Существует один запрос, который, кажется, не передается правильно:

$this->Model->find('all', array(
        'conditions' => array(
            'Model.column' => array(1, 2, 3)
        )
    )
);

Когда я использую этот синтаксис с mysql, кажется, что он «распаковывает» массив правильно, и сгенерированный запрос выглядит как

"... ГДЕ 'Model.column' IN (1, 2, 3) ..."

Когда я использую sql сервер, генерируется запрос

"... ГДЕ 'Model.column' В 'Массив'" ...

, что, очевидно, приводит к ошибке. Я вчера разместил этот вопрос в Google Group CakePHP, но ответа не получил, поэтому подумал, что попробую ТАК. Если у кого-то есть идеи / предложения, я был бы признателен.

Ответы [ 3 ]

1 голос
/ 10 марта 2010

Код, который генерирует это, находится в dbo_source.php (функция conditionKeysToString), и хотя определенные драйверы базы данных могут переопределить это, я никогда не видел, чтобы это было сделано.

У меня есть 1.2.5, 1.2.6 и 1.3.0-RC1 в моей системе, и все они добавляют 'IN ('), и ничто не переопределяет эту функцию. Нет случая просто добавить IN и затем решить, если это является массивом или скалярным значением. Слово Array - это то, что происходит, когда переменная массива вычисляется в строковом контексте. Например: php -r '$ a = array (1,2,3); echo $ a;' выведет Array .

Проверьте файл cake / VERSION.txt в обоих. Если они отличаются, создайте резервную копию каталога тортов на экземпляре SQL Server и замените его каталогом из MySQL.

Если они одинаковые, попробуйте перейти в каталог cake / libs / model / datasources. Надеюсь, у вас Unix или Linux, потому что «grep -r 'IN' *» вам очень поможет. В противном случае сравните dbo_soures.php и dbo / dbo_mssql.php между обеими установками Cake и посмотрите, есть ли различия в conditionKeysToString.

В конечном итоге я бы обновился до 1.2.6 только для того, чтобы вы получили все исправления.

0 голосов
/ 11 марта 2010

Попробуй так:

$this->Model->find('all', array(
        'conditions' => array(
            'Model.column' => array(
                'OR' => array(1, 2, 3)
            )
        )
    )
);
0 голосов
/ 11 марта 2010

Попробуйте передать это условие в виде строки:

$this->Model->find('all', array(
        'conditions' => array(
            'Model.column in (1, 2, 3)'
        )
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...