2013-09-22 72 views
0

我有兩個表:產品與ID,名稱,價格和品牌領域和品牌與ID,名稱,網址字段。我想從這兩個表中選擇兩個字段。 我無法定義列和定義別名。select columns invalidQueryExeption

的productTable

... 
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未知列在 '字段列表'

什麼是好習慣的請求 'product.product.id' : 選擇p.id爲ID,p.name姓名,p.price,b.id爲brandid,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; 
} 

我發現如何在連接表上放置別名,但基表產品呢?

回答

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; 
} 
+0

第一個解決方案很好地工作。結果是:SELECT「p」。*,「b」。「id」AS「brandid」,「b」。「name」AS「brandname」,「b」。「url」AS「url」FROM「product」AS 「p」INNER JOIN「品牌」AS「b」ON「p」。「品牌」=「b」。「id」。但與第二個解決方案,像這樣$ select-> from(array('p'=> $ this-> table),array('id','name'));結果是一樣的,雖然我沒有添加字段「價格」。 – bsg78

+0

檢查編輯。 –