2010-01-07 2 views
0

У меня была проблема с методом Doctrine_Table::find(), так как это thorowing исключение SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokensЯвляется ли метод Doctrine_Table :: find() устаревшим?

Я решил проблему с помощью Doctrine::getTable('City')->findOneById($id); вместо и она отлично работает.

Когда я попытался просмотреть информацию о проблеме, я был удивлен, так как нет документации о методе Doctrine_Table::find() в official website.

Любой знает, в чем проблема? это устарело? Кстати, он существует на самом коде! версии (1.2.1).

подробнее о базе данных:

CREATE TABLE IF NOT EXISTS `country` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(64) NOT NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 


CREATE TABLE IF NOT EXISTS `city` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(64) NOT NULL , 
    `country_id` INT NOT NULL , 
    PRIMARY KEY (`id`, `country_id`) , 
    INDEX `fk_city_country` (`country_id` ASC) , 
    CONSTRAINT `fk_city_country` 
    FOREIGN KEY (`country_id`) 
    REFERENCES `country` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

Что странно, что оба Doctrine_Table::find() и Doctrine_Table::findOneById() отлично работает на Country столе !.

PS: Я понимаю, что Doctrine_Table::findOneById() - это __call() сгенерированный метод. И это заставляет меня запутаться больше, почему фактический метод find() не может вести себя так, как ожидалось (это мое ожидание неправильно или что)!

ответ

0

О, мой плохой. Я раньше этого не видел, позор на меня = p

В таблице есть два первичных ключа (id и country_id), поэтому для метода find вам необходимо передать оба параметра методу поиска.

Вы могли бы вместо этого использовать магические методы:

Doctrine::getTable('City')->findOneById(1) 
+0

Спасибо :), я думал, что это причина, но это не имело смысла для меня ... даже сейчас !. Так или иначе, это вещь для дизайна. Поэтому я могу использовать 'Doctrine :: getTable ('City') -> findOneById (1)' без проблем :). –

+0

Я понял! Я ошибся при разработке базы данных в первую очередь !. Извините БД нет. Я не должен устанавливать внешний ключ как основной ... –

0

В клиновых 1.2.1, Doctrine_Table :: найти() является НЕ осуждается Вы можете проверить официальную документацию по http://www.doctrine-project.org/documentation/manual/1_2/en/component-overview#table:finder-methods

Что касается ошибки «недопустимый номер параметра», это означает, что вы запрос имеет больше или меньше параметров, чем ожидалось, чаще всего вы использовали маркер (?) и забыл добавить параметр к нему

Doctrine_Query::create() 
->from('User u') 
->where('u.name = ?', 'Jonh') 
->andWhere('u.is_active = ?') 

в примере я использовал два лексемы «?», но только один параметр «Jonh», он выдавал бы ту же ошибку: «Недопустимый номер параметра: количество связанных переменные не соответствуют числу токенов "

+0

В моем случае я передаю один параметр, который является выявленной 'id' из' 'международного, так это требует прохождения каждого первичного ключа или что ?? –

+0

можете ли вы разместить запрос, который вы используете? это очень помогло :) –

+0

Задача-запрос таков: 'Doctrine :: getTable ('City') -> find (1);' и написано в моем вопросе. –

Смежные вопросы