0

在我的一个表单中,我想要一个下拉列表(sfWidgetFormChoice),其中选项是通过对数据库执行查询来动态生成的。

更准确地说,我将列出我在表中拥有的所有版本。查询看起来像这样:

select distinct version from mytable order by version desc

到目前为止我有什么但不起作用:

class myForm extends sfForm

$query = "select distinct version from mytable order by version desc";

$versions = Doctrine_Manager::getInstance()->getCurrentConnection()->fetchAssoc($query);

public function configure()

$this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::$versions))));

编辑:

谢谢你们的回答!非常感激!

无论如何,您的解决方案都基于拥有桌子的模型。我宁愿直接拥有一个 PDO,因为它更快。

Symfony 文档中,我在“使用原始 SQL 查询”下找到了我正在寻找的内容。

所以我扩展了我的表格以结束:

class myForm extends sfForm
{
  public function getVersions()
  {
    $connection = Doctrine_Manager::connection();
    $query      = "select distinct version from mytable order by version desc";
    $statement  = $connection->prepare($query);
    $statement->execute();
    $resultset = $statement->fetchAll(PDO::FETCH_COLUMN, 0);

    return $resultset;
  }

  public function configure()
  {
    $this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::getVersions()))));
  }
}

因此,我的下拉列表会正确填充我表中的内容,耶!但我也收到警告:

警告:在第 196 行的 lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php 中为 foreach() 提供的参数无效

警告:join() [function.join]:在第 141 行的 lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php 中传递的参数无效

警告:在第 196 行的 lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php 中为 foreach() 提供的参数无效

警告:在第 117 行的 lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/debug/sfDoctrineConnectionProfiler.class.php 中为 foreach() 提供的参数无效

知道我在这里做错了什么吗???奇怪的是,下拉菜单看起来不错。

4

4 回答 4

1

使用这样的table_method选项sfWidgetFormDoctrineChoice

在您的表单类中执行以下操作:

$this->setWidgets(array('version' => new sfWidgetDoctrineChoice(array('model' => 'Version', 'table_method' => 'getData')));

然后在versionTable.class.php文件中创建一个getData()(你可以称之为任何东西)函数,它返回一个对象集合:

public function getData() {
    $this->getInstance()->createQuery()
          ->orderBy('version desc')
          ->execute();
}
于 2012-06-29T13:00:58.060 回答
0

您可以使用sfWidgetFormDoctrineChoice

public function configure(){

$this->widgetSchema['version'] = new sfWidgetFormDoctrineChoice(array('model' => 'YourModel', 'query' => Doctrine::getTable('YurModel')->getYourDataQuery(), 'add_empty' => true));

}

在你的modelTable.class.php

 public function getYourDataQuery()
    {
          //Your query

            $q = $this->createQuery('a');         

        return $q;
     }
于 2012-06-28T21:08:23.323 回答
0

我终于找到了我自己正在寻找的解决方案。这现在直接访问数据库。我不再使用 FETCH_COLUMN 的原因是这将创建一个数组,其中键是从 0 开始的 Id,值是查询本身返回的任何值。相反,我想让键和值成为查询提供的任何内容。这就是为什么查询现在提供两个相同的列,然后 FETCH_KEY_PAIR 完成其余的工作。

如果其他人对我如何解决这个问题感兴趣,这是我的代码,它可以正确填写下拉列表并且不会导致错误。

class myForm extends sfForm
{
  public function getVersions()
  {
    $connection = Doctrine_Manager::getInstance()->getCurrentConnection()->getDBh();
    $query      = "select distinct version as key, version as value from mytable order by version desc";
    $statement  = $connection->prepare($query);
    $statement->execute();
    $resultset = $statement->fetchAll(PDO::FETCH_KEY_PAIR);

    return $resultset;
  }

  public function configure()
  {
    $this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::getVersions()))));
  }
}
于 2012-07-04T14:40:10.843 回答
0

谢谢楼主,非常感谢你的解决方案。你拯救了我的一天!

以防万一有类似问题的人。我在使用该解决方案时遇到了 PDO not found 问题。(FatalErrorException: Error: Class '.......\Controller\PDO' not found in ) 原因是: https ://groups.google.com/forum/#!topic/symfony2/ mR22XXKPQrk “您在滥用PHP 命名空间。当您在命名空间代码中时,使用 PDO 表示相对于当前命名空间的类名。您有两种解决方案来解决您的问题:使用完全限定的类名,如 \PDO 或添加 use 语句来导入类在当前命名空间中。”

因此,在 PDO:: 前面添加 '\' 后,该解决方案完美运行。

谢谢!

于 2013-11-12T07:56:58.180 回答