2009-11-18 65 views
2

我對codeigniter很陌生,但是理解OOP和MVC,因爲我做了很多Rails開發。我還沒有想到的一件事是如何在codeigniter中編寫一個類級別的方法並在控制器中進行訪問。例如,我有codeigniter中的類方法和實例方法,我該如何使用它們?

<?php 
class User_model extends Model { 
    function user_model() 
    { 
     parent::Model(); 
    } 

    public static function get_total_users_count(){ 
     $results = $this->db->query("SELECT * FROM bhr_users GROUP BY userid"); 
     if($results){ 
      return $results->num_rows(); 
     } 
     return 0; 
    } 
} 
?> 

我想我在這裏做的是建立了我的模型一類級別的方法,我應該能夠在我的控制器User_model::get_total_users_count()現在它以前的程序員稱爲叫「歡迎」我碰到這樣的:

<?php 

class Welcome extends Controller { 

    function Welcome() 
    { 
     parent::Controller(); 
     $this->load->model('bhr_model'); 
      $this->load->model('user_model'); 
    } 

    function index() 
    { 

     $invite = $this->uri->segment(3); 
     if($invite == 'invitefriends') { 
      $pagedata['invitefriends'] = $invite; 
     } else { 
      $pagedata['invitefriends'] = ''; 
     } 

     $pagedata['numberofpeople'] = User_model::get_total_users_count(); 
     $this->load->view('default_page', $pagedata); 
    } 
} 

上述方法調用get_total_users_count不起作用,因爲它說,因爲我用在get_total_users_count類級函數的分貝方法。換句話說,當我引用一個類時,$沒有db方法。

所以現在我的問題有點更理論了。我一直認爲實例方法應該只在方法作用於某個類的特定實例時使用。有道理,對嗎?但是,get_total_users_count正在處理所有「用戶」並對它們進行計數。這似乎應該是一個類級別的方法。你同意嗎?如果這樣做,你知道如何通過在類級別函數中使用框架來訪問數據庫嗎?

謝謝!

回答

7

既然你沒有實例User_model,你必須得到CI實例,然後使用您的數據庫查詢。

內get_total_users_count():

$ci_ins =& get_instance(); 
$ci_ins->db->query(); 
+0

爲什麼downvote?這回答了「如何通過使用類級函數內的框架來訪問數據庫」這一問題 – putolaruan 2009-11-19 00:50:44

0
$pagedata['numberofpeople'] = $this->user_model->get_total_users_count(); 

這就是CI方式。

+0

這並不能真正解決當前的理論問題。獲取總用戶的函數不在用戶的實例上運行,因此它應該可能是類級別的方法 – Tony 2009-11-18 03:57:49

+0

那麼最好的方法是創建CI超級對象的實例 – 2009-11-18 07:06:09

1

get_total_user_count對於用戶表格網關來說更具功能。

用戶模型應該有像getUsernamegetLastLogin的東西。

用戶表網關應具備之類的東西findUserByIdcreateNewUser,並getTotalUserCount

+0

您是否建議我爲每個用戶添加一個網關類表。我想用你最終需要的方法。我不反對它,只是看起來像矯枉過正 – Tony 2009-11-18 06:18:24

+0

是的,這是即時通訊建議。它使事情變得更加清潔,而且更有意義,因爲你說得對,該函數不會影響特定的用戶實例。 http://martinfowler.com/eaaCatalog/tableDataGateway.html – Galen 2009-11-18 16:02:37

+1

有趣的一點,我會考慮這樣做。然而,我可以爭辯說,所有的級別方法都是網關,所有實例級別的方法都不是......並且不需要創建兩個單獨的類 – Tony 2009-11-20 18:20:26

2

CodeIgnighter的工作原理是通過你加載它們實例化您的模型。 Thorpe Obazee說什麼是使用你的模型的正確的codeIgnighter方法。

你在問什麼,如果你可以像大多數情況下所期望的那樣使用靜態方法,這只是CI的工作方式。爲了完成你所追求的目標,mives指出get_instance()是獲得主要CI對象的正確方法。我自己用這種方式來做你正在做的事情。

3

您可以將您的類作爲幫助程序,因此它不會作爲實例加載。只有代碼將包括在內,因此您可以將其稱爲:

$sample = class_name::method(); 
相關問題