在where()子句中推进多参数绑定

时间:2013-03-26 22:26:17

标签: symfony-1.4 propel

我正在尝试使用symfony 1.4.20在Propel 1.6上运行此查询。

我想将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

1 个答案:

答案 0 :(得分: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();

如果必须在一个查询中完成此操作,建议使用原始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是有益的参考。有几种方法可以做到这一点。我在这里指出了一种适合你的方法。

修改 这是一个关于将此作为一个查询执行的想法[因为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();