0

私のフォームの 1 つで、データベースでクエリを実行することによってオプションが動的に生成されるドロップダウン (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の方が高速なので、直接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()))));
  }
}

この結果、私のドロップダウンは私のテーブルにあるもので適切に満たされます。しかし、警告も表示されます:

警告: lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php の 196 行目の foreach() に無効な引数が指定されました

警告: join() [function.join]: lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php の 141 行目に無効な引数が渡されました

警告: lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php の 196 行目の foreach() に無効な引数が指定されました

警告: lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/debug/sfDoctrineConnectionProfiler.class.php の 117 行目の 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

私は最終的に自分で探していた解決策を見つけました。これにより、DB に直接アクセスできるようになりました。FETCH_COLUMN をもう使用しない理由は、これにより、キーが 0 から始まる ID であり、値がクエリ自体によって返されるものである配列が作成されるためです。代わりに、キーと値をクエリが提供するものにしたかったのです。これが、クエリが同じ 2 つの列を提供し、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 に答える