2011-07-06 4 views
1

Modelクラスでは、単一行を返すのにreturn $query->row();を使用し、複数行を返すときにはreturn $query->result();を返します。Codeigniterの返り値と行

単一のページでは、1つの行と複数の行を別々の2つのテーブルから返す必要があります。

usersには、ユーザー名、氏名、電子メールアドレスなどの一般的な情報が含まれています。 表user_linksには、それぞれのユーザーから送信されたリンクが含まれており、各ユーザーに複数の行があります。私のコントローラで

マイクエリ

 $this->db->select('*'); 
     $this->db->from('users'); 
     $this->db->join('user_links', "user_links.user_id = users.user_id"); 
     $this->db->where('users.user_id', $user_id); 
     $this->db->where('user_links.user_id', $user_id); 
     $query = $this->db->get(); 
     return $query->row(); 

私は固有のユーザーIDを含む第三URLセグメントであること

$user_id

$data['row'] = $this->User_model->user_read($user_id);で私のビューでクエリをロードします。

は最後に、私の見解で、私はこれは、単一の行のために動作しますが、どのように私は、ユーザーリンクのforeachループを作成することができますecho $row->first_name;

で行を検索しますか?目的は、単一行のループを回避し、複数の行を検索するためだけにループを使用することです。

答えて

2

何かを行うことができます単一のクエリでユーザーデータとuser_linksデータの両方を取得しながら、ユーザーのデータを取得するための反復処理を回避します。これはresult_arrayを使って可能ですが、その特定のユーザーのuser_linksにエントリがない場合は結果が0になるので、私はそれに反対します。

私は、ユーザテーブルからユーザを取得するクエリとuser_linksテーブルからユーザのリンクを取得するクエリの2つのクエリを使用することをお勧めします。これにより、結合を避けることもできます。

+0

ありがとう!私は前に2つのクエリを使用していましたが、コントローラとビューの両方から送信しましたが、結合はより専門的に見えました。 – CyberJunkie

1

あなたが欲しいものを伝えるのは難しいです。

row()またはresult()を渡しているかどうかをチェックし、それに応じて処理する機能が必要です。

result()としてすべてを渡したとすれば、私の意見では、あなたのコードは読みやすく(維持しやすい)と思います。また、ユーザーに素晴らしいメッセージを表示するためにセットが空であるかどうかを確認します。

1

すでにCIのアクティブレコードによって提供される他の機能のいくつかを探しているような音:あなたはそれをやっていることについてhttp://codeigniter.com/user_guide/database/results.html

はうまくいくの機能result_arrayに建て使用してのように聞こえます。あなたはそのようにそれを使用します。

LINK上から見た

$query = $this->db->query("YOUR QUERY"); 

foreach ($query->result_array() as $row) 
{ 
    echo $row['title']; 
    echo $row['name']; 
    echo $row['body']; 
} 
+0

お寄せいただきありがとうございます! 'result_array'はモデルから' result() 'を返すのと同じですか?オブジェクト形式は純粋な配列よりも綺麗に見えます。 – CyberJunkie

+0

はい、配列形式でのみ同じことです。私はあなたが本当に求めていたことを誤解しているに違いない。あなたが望むものを正確に明らかにできますか? – Obto

+0

私のモデルの 'row()'と 'result()'をコントローラに戻して、ビューから見ると、1行に 'echo $ row-> some_value;'を使うか、 'result()'関数 – CyberJunkie

5

これは擬似コードですが、あなたはprobobly私が正しくあなたの質問を理解していれば、あなたがしたい

このような
$this->db->select('*'); 
    $this->db->from('users'); 
    $this->db->join('user_links', "user_links.user_id = users.user_id"); 
    $this->db->where('users.user_id', $user_id); 
    $this->db->where('user_links.user_id', $user_id); 
    $query = $this->db->get(); 
    if ($query->num_rows() == 1) 
    { 
     return $query->row(); 
    } 
    elseif ($query->num_rows() > 1) 
    { 
     return $query->result_array(); //This returns an array of results which you can whatever you need with it 
    } 
    else 
    { 
     //Add some logic to handle if there are zero results 
    } 
+0

行は1つのテーブルと1つ以上のテーブルを結びつけているので、row()とresult()の両方を返す必要があります。 if文はビューに追加する必要があると思います。 – CyberJunkie

+0

私はあなたの質問を理解してはならないはずですが、私はあなたのビュー内のif文を避け、コントローラまたはモデルで文を処理することをお勧めします。 – Odnxe

+0

ありがとう、Odnxe! ifステートメントの提案+1。モデルのif文を実装し、それがより良いかどうかを調べます。 :) – CyberJunkie

0

あなただけのこの行を置き換えることができます。

このいずれかで
$this->db->join('user_links', "user_links.user_id = users.user_id"); 

$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer'); 

はCodeIgniterの中で参加は、デフォルトではINNER JOINを使用しますが、user_linksにデータがない場合は、いくつかのケースでは、それは何も返しませんだから私は上記のように使用してフレームワークCIでLEFT JOINを使用することができます。

関連する問題