我正在尝试在Zend Framework 2中进行以下选择:
$select->from($this->table);
$select->join($this->multiLangTable, $this->table . '.id=' .$this->multiLangTable . '.'
. $this->foreignKey .' AND '. $this->multiLangTable . ".lang =".$locale, $mapping, 'left');
变量$locale是我的应用程序的语言(ca,es,en)。问题是应用程序显示并错误地说:
语句无法执行(42S22-1054-中的未知列"ca"on clause")
它将变量检测为列,但它不是列。
我以前也尝试过,但还没有找到一个好的方法。这是因为Zend只是将on语句中的所有内容都作为标识符。您可以将条件移动到where语句
$select->from($this->table);
$select->join($this->multiLangTable, $this->table . '.id=' .$this->multiLangTable . '.'
. $this->foreignKey, $mapping, 'Zend'Db'Sql'Select::JOIN_LEFT);
$select->where(array($this->multiLangTable . ".lang" => $locale));
或者,您可以在on语句中使用'Zend'Db'Sql'Expression
,但这将删除其中的所有qouting
$select->join($this->multiLangTable,new 'Zend'Db'Sql'Expression($this->table . '.id=' .$this->multiLangTable . '.'
. $this->foreignKey .' AND '. $this->multiLangTable . ".lang = ? ", $locale), $mapping, 'left');
我找到了一个适合我的解决方案。
$select->from($this->table);
$select->join($this->multiLangTable,new 'Zend'Db'Sql'Expression( $this->table . '.id=' .$this->multiLangTable . '.'
. $this->foreignKey . ' AND '.$this->multiLangTable . '.lang = ?'), $mapping, 'left');
$statement = $sql->prepareStatementForSqlObject($select);
$resultsSql = $statement->execute(array($locale));