0

私は、ユーザーが必要なときに必要な情報を作成する方法を実装して、ユーザーにとってより動的なシステムを作成しようとしています。(私の英語が苦手な方は申し訳ありません)

まず、次のようなUserという名前のテーブルがあります。

User:

id   |   name   |    login   |     password

1    |   Rose   |  rose.120  |     897763
2    |   John   |  john.red  |     120347
3    |   Mark   |  mark.foo  |     385598

および各ユーザーの情報を含む他のテーブル:

User_info:

id  |  user_id  |  info_name      |   value          |  required  |  order

6   |   1       | Telephone       |  555-4083        |   yes      |   2 
7   |   1       | Email           |  rose.120@g.com  |   yes      |   1 
8   |   1       | Another E-mail  |  rose.mg@fc.com  |   no       |   3 

データベースからこの値を取得するとき、PHPオブジェクトまたはこの値の配列を効率的に設定する方法を教えてください。
mysql_queryを作成しようとしましたが、この結果を使用してオブジェクトでループを作成し、任意の行に対してユーザーIDにWHERE句を作成します。(私はCodeIgniterを使用しています)

    if( $user != false ) $this->getUser();
    foreach( $this->user->result() as $row ) {
        $this->db->where('user_id', $row->id);
    }
    $this->db->from('user_info');
     ...

このオブジェクトがある場合は、User_info行をユーザーオブジェクトに配置する必要があります。正しい?
これがこれを行うのに良い方法なのか、それとも間違った方法なのか、私はただ興味があります。
それがはっきりしていることを願っています。
ありがとう。

4

3 に答える 3

1

基本的にはそうです。ただし、モデルを設定して、テーブルuser_infoとテーブルの両方から情報を取得するためのメソッドを定義することもできますuser。これらの線に沿った何か:

// in user_model.php
function get_user_with_info() {
  $user = $this->getUser();
  $user['info'] = $this->db->where('user_id', $row->id)->from('user_info')->row();

  return $user;
}

このクエリを頻繁に行うことを計画している場合は、すぐにN+1の問題が発生します。Codeigniterのより良いオプションはjoinget_users関数でテーブルを使用することです。

function get_users() {
  $this->db->select('*')
  $this->db->from('user');
  $this->db->join('user_info', 'user.id = user_info.user_id');

  $results = $this->db->result();
  $users = [];
  foreach ($results as $result) {
    $user_id = $result['user_id'];
    if (!isset($users[$user_id])) {
      $users[$user_id] = array(
        'id' => $user_id,
        'info' => array(
          // add info fields from first result
        )
      );
    } else {
      $users[$user_id]['info'][] = array( 
        // add additional info fields
      );
    }
  }
  return $users;
}

詳細を調整する必要がありますが、うまくいけば、これはどこかで始めることができます。

于 2012-04-25T04:53:49.583 に答える
0

コードcodeIgniterを使用しながら、モデルファイルに関数を作成し、コードを配置します。次に、コントローラーで、モデルでこの関数を呼び出し、必要なパラメーターを送信します。あなたはcodeigniterを使用しているので、アーキテクチャにも従わなければなりません。

于 2012-04-25T04:47:42.473 に答える
0

このように、ユーザーオブジェクトで動的配列を操作する必要があることを忘れないでください。$ user-> Telephone、$ user-> Emailなどとしてアクセスできる「Telephone」、「Email」などの名前のフィールドの代わりに(これは単純で、良い方法だと思います)、動的に作成する必要があります。 $ info_name->$valueのペアを持つ配列。また、「User」オブジェクトでは、各プロパティ$info_nameを解析する追加機能を作成する必要があります。これはより柔軟ですが、より複雑です。

ですから、柔軟性と複雑さの間で中庸を見つけなければならないと思います。

于 2012-04-25T04:55:52.040 に答える