0

Propel 1.6 と symfony 1.4.20 でこのクエリを実行しようとしています。

このサブクエリに 2 つのパラメーターをバインドしたいのですが、うまくいきません。

$paginas = PaginaQuery::create()                              
                               ->where("pagina.id not in (select id from cliente_artista where cliente_artista.cliente_id = ? and cliente_artista.culture = ?)"
                                       ,array('XXX', 'en')
                                      )
                          ->limit(5)
                          ->find();

これは私にエラーを与えます:

Cannot determine the column to bind to the parameter in clause

この投稿も見つけましたが、回答がありません ( https://groups.google.com/forum/?fromgroups=#!topic/propel-users/2Ge8EsTgoBg )

4

1 に答える 1

0

プレースホルダーを使用する代わりに。$id と $culture を使用できます。

//first, get an array of the id's
//define your vars
$id = $your_id_param;
$culture = 'en';
$cliente_artistas = ClienteArtistaQuery::create()
                        ->select('id')
                        ->distinct()
                        ->filterByClienteId($id)
                        ->filterByCulture($culture)
                        ->find();

$paginas = PaginaQuery::create()                              
               ->where("pagina.id NOT IN ?", $cliente_artistas)
               ->limit(5)
               ->find();

これを 1 つのクエリで実行する必要がある場合は、生の SQL を使用してパラメーターを PDO ステートメントにバインドすることをお勧めします (ただし、PropelObjectCollections の利便性は失われます)。

  public function getResultSet($id, $culture) {
    $id = $id_param;
    $culture = $culture_param;
    $sql = <<<ENDSQL
SELECT * from pagina
WHERE id NOT IN (SELECT distinct id 
                 FROM cliente_artista 
                 WHERE cliente_id = ?
                 AND culture = ?
                 )
LIMIT 5
ENDSQL;
    $connection = Propel::getConnection();
    $statement = $connection->prepare($sql);
    $statement->bindValue(1, $id);
    $statement->bindValue(2, $culture);
    $statement->execute();
    $resultset = $statement->fetchAll(PDO::FETCH_ASSOC); // or whatever you need

    if (! count($resultset) >= 1) {
      // Handle empty resultset
    }

    return $resultset;
  }

propel orm query methods を使用するために、いくつかのクエリ メソッドを記述することもできます。もちろん、propel apiは有益なリファレンスです。これを行うにはいくつかの方法があります。ここで、あなたに役立つ方法を1つ示しました。

編集: これを 1 つのクエリとして実行する場合のアイデアを次に示します [useSelectQuery() には「リレーション」名が必要であるため]、このアイデアはテーブルが関連していないと想定していますが、ID は次のとおりです。

$paginas = PaginaQuery::create()                              
           ->addJoin(PaginaPeer::ID, ClienteArtistaPeer::CLIENTE_ID, Criteria::LEFT_JOIN)
           ->where("ClienteArtista.Id <> ?", $id)
           ->where("ClienteArtista.Culture <> ?", $culture)
           ->select(array('your','pagina','column','array'))
           ->limit(5)
           ->find();
于 2013-03-26T23:25:11.313 に答える