2011-06-13 160 views
8

我正在用codeigniter開發一個站點。現在,通常當你在codeigniter中使用一個類時,你基本上使用它,就好像它是一個靜態類。例如,如果我頭一個名爲「用戶」的模式,我會首先使用模型類的codeigniter實例

$this->load->model('user'); 

,比加載它,我可以在應用程序調用上的用戶類的方法,如

$this->user->make_sandwitch('cheese'); 

我'm樓,我想有一個UserManagement類,它使用一個名爲'user'的類。

,這樣,比如我可以

$this->usermanager->by_id(3); 

,這將返回一個實例的用戶模型,其中ID爲3 什麼是做到這一點的最好辦法

+1

最好的辦法是使用ORM。 Doctrine很受歡迎,並且有一些教程將它與CodeIgniter – bassneck 2011-06-13 15:37:57

+0

@bassneck thx整合爲您的建議。我很可能不會在我目前的項目中使用它,但我一定會研究教義,乍一看看起來很棒。 – bigblind 2011-06-13 17:06:53

回答

16

CI中的模型類與其他語法中的模型類並不完全相同。在大多數情況下,模型實際上是某種形式的普通對象,具有與之交互的數據庫層。另一方面,對於CI,Model表示返回通用對象的數據庫層接口(它們在某些方面類似於數組)。我知道,我也感到撒謊。

所以,如果你想讓你的模型返回一些不是stdClass的東西,你需要包裝數據庫調用。

所以,這裏是我會做什麼:

創建具有模型類user_model_helper:

class User_model { 
    private $id; 

    public function __construct(stdClass $val) 
    { 
     $this->id = $val->id; 
     /* ... */ 
     /* 
      The stdClass provided by CI will have one property per db column. 
      So, if you have the columns id, first_name, last_name the value the 
      db will return will have a first_name, last_name, and id properties. 
      Here is where you would do something with those. 
     */ 
    } 
} 

在usermanager.php:

class Usermanager extends CI_Model { 
    public function __construct() 
    { 
      /* whatever you had before; */ 
      $CI =& get_instance(); // use get_instance, it is less prone to failure 
           // in this context. 
      $CI->load->helper("user_model_helper"); 
    } 

    public function by_id($id) 
    { 
      $q = $this->db->from('users')->where('id', $id)->limit(1)->get(); 
      return new User_model($q->result()); 
    } 
} 
+0

真棒,thx男人! – bigblind 2011-06-13 17:07:26

+3

您不需要手動實例化User_model。您可以將模型類名作爲result()的參數傳遞,並且它將返回一個填充了數據庫中數據的新實例。 '$ Q->結果( 'User_model')' – jfadich 2015-11-05 18:12:10

0

使用抽象工廠模式甚至數據訪問對象模式來完成您需要的工作。

0
class User extend CI_Model 
{ 
    function by_id($id) { 
     $this->db->select('*')->from('users')->where('id', $id)->limit(1); 
     // Your additional code goes here 
     // ... 
     return $user_data; 
    } 
} 


class Home extend CI_Controller 
{ 
    function index() 
    { 
     $this->load->model('user'); 
     $data = $this->user->by_id($id); 
    } 
}