2011-11-07 40 views
0

我在使用數據庫查詢時處理模型 - 視圖 - 控制器設置時最好的編碼實踐是什麼。我應該通過返回的查詢到控制器,像這樣......Codeigniter將查詢或生成的查詢數組傳遞給控制器​​

控制器

$query = $this->db->get(); 
$this->template->write_view('content', 'work/index', array('work_query' => $query)); 
$this->template->render(); 

查看

<?php if ($work_query->num_rows() == 0): ?> 
    <p>There are no works</p> 
<?php else: ?> 
    <?php foreach($work_query->result() as $work): ?> 
     //Do something 
    <?php endforeach; ?> 
<?php endif; ?> 

或者我應該從查詢調用類的一些功能(例如result_array())並將其傳遞給視圖。

控制器

$query = $this->db->get()->result_array(); 
$this->template->write_view('content', 'work/index', array('works' => $query)); 
$this->template->render(); 

查看

<?php if (empty($works)): ?> 
    <p>There are no works</p> 
<?php else: ?> 
    <?php foreach($works as $work): ?> 
     //Do something 
    <?php endforeach; ?> 
<?php endif; ?> 

是一個被認爲是更好的編碼標準?比另一個更有效率嗎?

+0

這與MVC設計模式沒有任何關係。 –

回答

2

正如pinadelsai已經說過的,邏輯告訴把你的查詢放入模型中。服務器2的目的:1)通過分離三個邏輯bheind MVC來保持更嚴格和更好的編碼實踐; 2)保持你的代碼有組織,並且更容易維護你想對你的查詢做一些改變的那一天。
看起來你只是在一個單一的視圖中調用查詢,但如果你多次調用它,並且你決定改變它呢?您需要檢查所有視圖並對其中的每個視圖進行更改;通過將邏輯保留在模型中,您只需更改一種方法,並將校正後的結果一次性提供給所有視圖。

一個小的補充和一條建議:您不一定需要調用數組返回函數來獲得數組形式的結果。做這樣的事情(在你的模型):

$query = $this->db->get('mytable'); // this is your fetching; 
$data = array(); 
foreach($query->result() as $row) 
{ 
    $data[] = $row; 
} 
return $data; 

如果您選擇使用的結果(),後來更改爲result_array你將有一個特性,這始終是在陣列形式($數據),無論是() ;你的視圖將保持相同的foreach邏輯,你只需要改變你如何調用值(使用數組表示法或對象表示法)。


更新:

按您的意見,您可以使用,當你有任何結果(但是這在很大程度上取決於你的設計有不同的看法更常見的是,你讓模型通與它的數據上對結果的量的信息,例如:。

$query = $this->db->get('mytable'); // this is your fetching; 
    $data = array(); 
    if($query->num_rows() > 0) 
    { 
     foreach($query->result() as $row) 
     { 
     $data[] = $row; 
     } 
    } 
    return $data; 

在這種情況下,開始$data作爲一個空數組如果返回的行,該陣列填充,否則將返回空就這樣。然後,你決定在你的視圖中(或者在我們的控制器中,如果你需要加載一個完全不同的視圖以防萬一)如何通過像你已經在你的代碼中做的那樣來區分這種情況。


除了所有這些,還沒有強制執行的法律,你需要強制。你可以在你的視圖中放置任何你想要的邏輯,但CI仍然可以工作。對業務邏輯,數據操作和數據顯示進行嚴格分離只是確保您的應用程序在將來更具可管理性;即使你是唯一一個維護你的代碼,但我很確定從現在開始的六個月,當你回到那些包含查詢的視圖時,你會詛咒自己沒有完成「正確」的MVC方式。

+0

謝謝!那麼我應該爲什麼時候創建一個不同的視圖來回應沒有結果?這樣所有的邏輯將在我的控制器? –

+0

呃,不,你的看法看起來不錯;我會更新我的代碼,給我一分鐘 –

+0

謝謝你的有用答案。快樂的編碼! –

0

最好不要在您的視圖中傳遞查詢。空閒的練習和MVC架構的核心概念是分離控制器(邏輯) - 模型(代碼隱藏/數據操縱) - 視圖(模板)。

建議將您的完整結果集傳遞給視圖。您可以傳遞查詢以查看罕見/特定情況下的問題。 [例如,您需要在頁腳中使用一些數據,以便在此視圖中調用您的模型查詢,以便您不必在控制器的每個函數中呈現模型查詢並將其傳遞到視圖。]

我希望在這裏讓馬點清楚。

謝謝。