2012-02-22 11 views
3

CIモデルの特定のインスタンスのプロパティに関する質問があります。例:CodeIgniterモデルとプロパティ

project_modelというモデルがあります。

これはそれと呼ばれる
$total_projects = $this->project_model->Get_Projects($options); 

はそうのようなモデルでプロパティを作成します:モデルでは、それは、メソッドのcalleのGet_Projectsを持って

$query = $this->db->get('projects');//query 

$this->num_rows = $query->num_rows(); 

return $query->result(); 
メソッドが呼び出されているので、後

とコントローラで

、私はNUM_ROWSにアクセスする必要があります。

$num_rows = $total_projects->num_rows; 

(私はあなたのいくつかは、コントローラにnum個の行を使用しての背後にある理由を質問することができる知っているそれは、改ページを設定することで行うことだ、それを行うためのより良い方法があるかもしれませんが、目。 。EREは、この特定のプロジェクトには時間がありません)

私の問題は、これが構文エラーを作成することです:

Severity: Notice 
Message: Trying to get property of non-object 
Filename: controllers/projects.php 
Line Number: 110 ($num_rows = $total_projects->num_rows;) 

まず理由ですか?私はこれを使うことを考えていました:代わりに$ this-> project_model :: num_rows?しかし、num_rowsは$ total_rowsオブジェクトに固有のものではありませんか?だから、それはちょうどモデル全体のためになるでしょう。

BTW:モデルのCIガイドを読みましたが、モデルのインスタンスを作成するための情報はまったくありませんでした。

EDITED:オブジェクト固有のnum_rowsプロパティの結果が必要です。たとえば、次のようになります。

$a=$this->project_model->Get_Projects($options); 
$b=$this->project_model->Get_Projects($options); 
$num_rows = $this->project_model->num_rows; 

最後の行には、$ b num_rowsの結果が得られますが、$ aではありません。だから私はそれをオブジェクト固有のものにすることができるようにそれをどのように呼びますか? (明らかに私は変数の2番目の呼び出しの前にそれを格納することができます)

+0

私は実際には、クラスプロパティがCIに単一の値しか格納しないので、これを間違った方法で行っていると思います。私はresult()でnum_rowsを返す必要があると思います。だから今私はそのコードで遊んでいます。現在、私はこれを持っています:$ query = $ this-> db-> get( "projects"); $ result-> result = $ query-> result(); $ result-> num_rows = $ query-> num_rows(); (これは改行なしのコメントでは難しいです)基本的には、結果のプロパティとnum_rowsのプロパティを作成しています。しかし、それを使用する前に$ resultを宣言するにはどうすればよいですか? varを使う必要がありますか?現時点では混乱しています。 – Adamantus

+0

また、コントローラ側でlist()を使用して結果とnum行を別々​​に取得し、変数を作成することもできます。 – Adamantus

+0

私は自分の問題を解決しました。私は明日の解決策を掲載する予定です。私は100 Expや何かを持っていないので許可されていません。 – Adamantus

答えて

1

必要なときにモデルをインスタンス化できます。

$object_one = new $this->project_model; 
$foo = $object_one->Get_Projects($options); 
var_dump($foo); 
echo $object_one->num_rows; 

$object_two = new $this->project_model; 
$bar = $object_two->Get_Projects($options); 
var_dump($bar); 
echo $object_two->num_rows; 

このようにして、各モデルインスタンスの属性を別々に取得/設定できます。

+0

ありがとう、今私はインスタンスを行う方法を知っています。なぜこれはドキュメントにないのですか? – Adamantus

+0

これはちょっと基本的なOOPですが、私はあなたの心の中でそれを見たことがありません。 CI自体は1つの巨大なオブジェクトです(var_dump($ this)を実行してブラウザがハングするのを見てください) – Rooneyl

+0

私はそれを行う構文を新しくすることはありません。 $ object_one = new $ this-> project_model;奇妙に思える。 Javaを学ぶと、次のようになります:Project object_one = new Project();例えば。 – Adamantus

2

これは、変数$total_projectsにクラスのインスタンスがないために発生します。単にGet_Projects()関数の結果が含まれています。

あなたは、すべてをやった後、してみてください$num_rows = $this->project_model->num_rows(未テスト)

+0

しかしそれはインスタンスではありませんか?それは$ this-> project_model-> num_rowsであり、total_rowsは言及されていません。したがって、Get_Projectsメソッドを2回呼び出した場合、$ this-> project_model-> num_rowsの結果は呼び出しごとに変わります。私は個々の呼び出しごとに個々のnum_rowsプロパティを取得できるようにしたい。 – Adamantus

+0

ダング!申し訳ありません。 – Indranil

+0

@Adamantusより良いあなたの質問にこの要件を追加します。 –

0
****** Model **** 

class Project_model extends .... { 

    private $num_rows = 0; 
    public function Get_Projects($options){ 
     ..... 
     $query = $this->db->get('projects');//query 
     $this->num_rows = $query->num_rows(); 
     return $query->result(); 
    } 

    public get_num_rows(){ 
     return $this->num_rows; 
    } 
} 

**** Controller **** 

class Project extends .... { 
    function project(){ 
     ... 
     $total_projects = $this->project_model->Get_Projects($options); 
     $num_rows = $this->project_model->get_num_rows(); 
     ... 
    } 
} 

ないカプセル化の完璧なexapleけど....

1

より良い方法は、2つのクエリを作ることです。必要があります

1つはnum行、もう1つは結果です。

num行ではなく、結果のみを返します。だから、値を返さないでしょう。

各クエリを異なる機能にします。そして、その関数から呼び出します。

パフォーマンス面についてはわかりませんが、

+0

はい、私はこのオプションについて話すためにOPにコメントを追加しました。 – Adamantus

関連する問題