【问题标题】:Is the method Doctrine_Table::find() deprecated?方法 Doctrine_Table::find() 是否已弃用?
【发布时间】:2010-01-07 16:17:44
【问题描述】:

我对@9​​87654322@ 方法有疑问,因为它抛出了一个异常 SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

我改用Doctrine::getTable('City')->findOneById($id); 解决了这个问题,它工作正常。

当我试图调查这个问题时,我感到很惊讶,因为在 official website 中没有关于方法 Doctrine_Table::find() 的文档。

有谁知道问题出在哪里?它被弃用了吗? 顺便说一句,它存在于实际代码中!版本(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() 方法不能按预期运行(是我的预期错误还是什么)!

【问题讨论】:

    标签: php mysql doctrine foreign-keys


    【解决方案1】:

    哦,我的错。之前没看到,不好意思=p

    您的表有两个主键(id 和 country_id),因此 find 方法需要您将两个参数都传递给 find 方法。

    您可以改用魔术方法:

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

    【讨论】:

    • 谢谢 :),我认为这是原因,但它对我来说没有意义......即使是现在!无论如何,这是一个设计问题。所以我可以毫无问题地使用Doctrine::getTable('City')->findOneById(1) :)。
    • 我明白了!我一开始就犯了设计数据库的错误!。对不起,数据库不。我不应该将外键设置为主...
    【解决方案2】:

    从 v 1.2.1 开始,Doctrine_Table::find() 已不弃用 你可以在http://www.doctrine-project.org/documentation/manual/1_2/en/component-overview#table:finder-methods查看官方文档

    至于“invalid parameter number”错误,表示您查询的参数比预期的多或少,大多数情况下您使用了标记(?)而忘记向其添加参数

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

    我使用的例子有两个token '?',但是只有一个参数'jonh',它会抛出同样的错误:“Invalid parameter number: number of bound variables does not match number of tokens”

    【讨论】:

    • 在我的情况下,我传递了一个参数,它是City 的标识id,所以它需要传递每个主键还是什么??
    • 您可以发布您正在使用的查询吗?这将有很大帮助:)
    • 问题查询是这个:Doctrine::getTable('City')->find(1);,它写在我的问题中。
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 2014-08-29
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2021-11-15
    • 2023-03-08
    相关资源
    最近更新 更多