0

我有两个表:带有 id、名称、价格和品牌字段的产品和带有 id、名称、url 字段的品牌。我想从这两个表中选择两个字段。我无法定义列并定义别名。

产品表

...
public function fetchAll()
{

    $select = new Select;
    $select->from($this->table);
    $select->join('brand', 'product.brand = brand.id', array('name', 'url'));
    $select->columns(array('product.id', 'name', 'price'));

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
   }

消息:SQLSTATE [42S22]:找不到列:1054 未知列 'field list' 中的 'product.product.id'

请求的最佳做法是什么:选择 p.id 作为 id,p.name 作为名称,p.price,b.id 作为品牌标识,b.name 作为品牌名称......

经过几次尝试,我找到了这个解决方案:

public function fetchAll()
{

    $select = new Select;
    $select->from($this->table);
    $select->join(array('b' => 'brand'), 'product.brand = b.id', array('brandid' => 'id', 'brandname' => 'name', 'url'));
    $select->columns(array('id', 'name', 'price'));

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
}

我找到了如何在连接表上放置别名,但是基表产品呢?

4

1 回答 1

1

您可以为基表指定别名,如下所示:

$select->from( array('p' => $this->table));

如果您想同时添加列,可以这样做:

$select->from( array('p' => $this->table), array('id', 'name', 'price'));
// $select->columns(array('id', 'name', 'price')); // no need for that now

要为某些列添加别名,您可以使用:

$select->from( array('p' => $this->table), array('id' => 'pid', 'name' => 'pname', 'price'));

文档: http: //framework.zend.com/manual/1.12/en/zend.db.select.html#zend.db.select.building.from

编辑 :

您的代码将是:

public function fetchAll()
{
    $select = new select();
    $select->from(array('p' => $this->table), array('id','name', 'price', 'brand'));
    $select->join(array('b' => 'brand'), 'p.brand = b.id', array('name', 'url'));

    // var_dump($select->__toString()); // Use this to print the SQL query corresponding to your select object

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
}
于 2013-09-22T18:06:10.473 回答