2014-04-23 60 views
1

完全混淆瞭如何實現某些東西 - 我有三張桌子;Codeigniter - 將三張表組合成正確的視圖格式

  • 訂單
  • 項目
  • 產品

Orders表包含一個訂單的詳細信息,項目表中包含產品ID號和訂單號,並表包含產品所有的產品細節。

我試圖做的是有一個「我的訂單」頁面,在這裏你可以查看你的所有過去的訂單,而我想的是能夠有以下結構...

訂單

ORDER NUMBER 1

  • 例訂單項目
  • 第二示例訂單項目
  • 第三示例訂單項目

ORDER NUMBER 2

  • 例訂單項目
  • 第二示例訂單項目
  • 第三示例訂單項目

ORDER NUMBER 3

  • 實例訂單項目
  • 第二個例子訂單項目
  • 第三個例子訂單項目

現在我可以很容易地列出所有的訂單,我可以列出一個特定的順序上的所有項目,但我迷失在如何合併這三個表格,我可以用上面的格式列出它們,我假設我可以加入所有三個表格,但我無法讓它們在任何接近正確方式的地方輸出。

有沒有人知道這樣做的好方法?提前謝謝了。

+0

好這樣做的方式是使用Codeigniter實現Datamapper,因此您可以非常輕鬆地設置您的關係。這樣你可以創建一個訂單對象並獲取連接的數據。否則,編寫你自己的SQL查詢,確實是用一些連接。 – Fven

+0

感謝您的幫助!我一定會考慮Datamapper,我還沒有使用ORM,所以有很多學習要做! –

回答

1

您可以使用連接查詢來獲取所有的訂單與他們的項目

/* raw sql query */ 
SELECT o.*,p.*,o.id AS order_id,p.id AS product_id 
FROM Orders o 
LEFT JOIN Items i ON (o.id=i.order_id) 
LEFT JOIN Products p ON(p.id = i.product_id) 
ORDER BY order_id 

在模型中創建一個功能,下面的查詢

/* Using Active record */ 

$orders=$this->db->select('o.*,p.*,o.id AS order_id,p.id AS product_id') 
       ->from(' Orders o ') 
       ->join(' Items i','o.id=i.order_id','LEFT') 
       ->join(' Products p','p.id = i.product_id','LEFT') 
       ->order_by('order_id') 
       ->get() 
       ->result(); 

運行給你結果從模型控制器,然後通過它來查看,鑑於您可以循環查詢記錄爲

$currentParent = false; 
foreach ($orders as $o) { 
    if ($currentParent != $o->order_id) { 
     echo '<h1>ORDER NUMBER ' . $o->order_id . '</h1>'; 
     $currentParent = $o->order_id; 
    } 
    echo '<p>' . htmlentities($o->product_name) . '</p>'; 
} 

Thi遺囑輸出

<h1>ORDER NUMBER 1</h1> 
    <p>product 1</p> 
    <p>product 2</p> 
<h1>ORDER NUMBER 2</h1> 
    <p> product 3</p> 

如果你有不同的HTML結構中使用的標題和段落標記

編輯在您使用列表標記相應地改變它,我上面的例子提供了你可以這樣做

echo '<ul><li>'; 
$currentParent = false; 
foreach ($orders as $o) { 
    if ($currentParent != $o->order_id) { 
     if ($currentParent != false) { 
      echo '</ul></li><li>'; 
     } 
     echo '<h1>ORDER NUMBER ' . $o->order_id . '</h1><ul>'; 
     $currentParent = $o->order_id; 
    } 
    echo '<li>' . htmlentities($o->product_name) . '</li>'; 
} 
echo '</li></ul>'; 

這將輸出

<ul> 
    <li> 
     <h1>ORDER NUMBER 1</h1> 
     <ul> 
      <li><p>product 1</p></li> 
      <li><p>product 2</p></li> 
     </ul> 
    </li> 
    <li> 
     <h1>ORDER NUMBER 2</h1> 
     <ul> 
      <li><p> product 3</p></li> 
     </ul> 
    </li> 
</ul> 
+0

絕對太棒了!非常感謝這個,真的幫助我理解加入更多以及顯示它的邏輯!我不認爲我真的很厚顏無恥,並問你是否知道如何讓HTML輸出被包裹在一個元素中?我想要LI元素中的訂單,但無法找到正確打開/關閉循環內標籤的方法!再次感謝,非常感謝:-) –

+0

@CarlBembridge我已經添加了使用列表標籤的示例,看看它是否工作 –

+1

完美 - 你是一個絕對的明星。再次感謝您的時間和幫助,非常感謝。 –