2010-09-16 93 views
1

這是我第一次使用Zend Framework作爲應用程序,而且我不知道我是否完全通過模型頭腦。

我有四個表:shopping_cart,product,product_unit,distributor。 購物車有一個cart_id,product_id,unit_id和dist_id(購物車與其對應的id加入其他表)。

Zend公司之前,我將創建一個類是這樣的:

class ShoppingCart 
{ 
function getItems() 
{ 
$sql ="select * from shopping_cart, product, product_unit, distributor 
where 
shopping_cart.product_id = product.id AND 
shopping_cart.unit_id = product_unit.id AND 
shopping_cart.dist_id = distributor.id AND 
cart_id = xxx"; 

$items = $this->db->getAll($sql); 
} 

一個查詢來從連接表的所有信息。

當我成立Zend_Db_Table_Abstract關係映射:

我的購物車型號:

class Application_Model_ShoppingCart 
{ 
    function __construct() 
    { 
     $this->ShoppingCartTable = new Application_Model_DbTable_ShoppingCart(); 
    } 

    function getItems() 
    { 
     $cart_items = $this->ShoppingCartTable->getItems($this->GetCartId()); 
     return $cart_items; 
    } 
} 

類Application_Model_DbTable_ShoppingCart擴展Zend_Db_Table_Abstract {

protected $_name = 'shopping_cart'; 

protected $_rowClass = 'Application_Model_DbTable_ShoppingCart_Item'; 

protected $_referenceMap = array(
    'Product' => array(
     'columns'   => 'product_id', 
     'refTableClass'  => 'Application_Model_DbTable_Product', 
     'refColumns'  => 'id' 
     ), 
    'Distributor' => array(
     'columns'   => 'dist_id', 
     'refTableClass'  => 'Application_Model_DbTable_Distributor', 
     'refColumns'  => 'id' 
     ), 
    'Unit' => array(
     'columns'   => 'unit_id', 
     'refTableClass'  => 'Application_Model_DbTable_ProductUnit', 
     'refColumns'  => 'id' 
     ) 
); 

public function getItems($cart_id) 
{ 
    $where = $this->getAdapter()->quoteInto('cart_id = ?', $cart_id); 

    return $this->fetchAll($where); 
} 

}

在我的控制器:

$this->_shoppingCartModel = new Application_Model_ShoppingCart(); 
$items = $this->_shoppingCartModel->getItems(); 

在我看來:

foreach($this->items AS $item) 
{ 
    $item_product = $item->findParentRow('Application_Model_DbTable_Product'); 
    $item_dist = $item->findParentRow('Application_Model_DbTable_Distributor'); 
    $item_unit = $item->findParentRow('Application_Model_DbTable_ProductUnit'); 
} 

當我在我的車十項分貝探查顯示六十查詢(哇)來查看車中的項目(在所有四個信息將顯示錶格 - 產品名稱,單位描述,分銷商名稱)。 對於每個商品,它將查詢shopping_cart,然後查詢產品表,然後查詢產品單位,然後查詢distributor_table。

有沒有辦法讓這個運行成爲一個通過Zend_Db_Table_Abstract關係連接所有表的查詢?
我將不得不回到在我的Application_Model_ShoppingCart類中使用數據庫適配器嗎?

我想抽象的錶款(Application_Model_DbTable_ShoppingCart),而不是所有的數據訪問都將Application_Model_ShoppingCart綁到一個數據庫處理程序。

在此先感謝您的建議,我喜歡Zend Framework,但考慮到人們談論使用它們的不同方式時,模型仍然很難理解。

回答

1

總之,不幸的是,不可能在單個查詢中獲得一組表格行與它們的關係。

這只是處理關係的所有方法都是爲一行定義的,而不是爲表定義的。

但至少,你可以用Zend_Db_Table_Select來形成你的sql,而不是手工編寫它。

Upd:在我看來,您購買ShoppingCarts的代碼應該屬於表格(DbTable_ShoppingCart)。所以,你在一開始提供的代碼可以被轉化爲以下幾點:

class Application_Model_DbTable_ShoppingCart extends Zend_Db_Table_Abstract { 
    public function getItem($cart_id) { 
     $select = $this->select() 
        ->from(array('sc' => 'shopping_cart'), array(Zend_Db_Select::SQL_WILDCARD)) 
        ->join(array('p' => 'product'), 'sp.product_id = p.id', array(Zend_Db_Select::SQL_WILDCARD)) 
        ->join(array('pu' => 'product_unit'), 'sp.unit_id = pu.id', array(Zend_Db_Select::SQL_WILDCARD)) 
        ->join(array('d' => 'distributor'), 'sp.dist_id = d.id', array(Zend_Db_Select::SQL_WILDCARD)) 
        ->where('sp.cart_id = ?', $cart_id) 
        ->setIntegrityCheck(false); 
     return $this->fetchAll($select); 
    } 
} 
+0

維卡謝謝你的快速反應......如果我使用Zend的表中選擇..是它更好地執行在自定義連接模型類Application_Model_ShoppingCart類或Application_Model_ShoppingCart_DbTable中? – 2010-09-17 04:03:48

+0

非常感謝你的時間。乾杯 – 2010-09-17 14:46:52