2012-04-25 69 views
0

我试图为我的用户创建一个更具动态性的系统,实现他们在需要时创建每个必要信息的方式。 (如果我的英语对不起弱)

首先,我有一个表命名用户,就像这样:如何实现另一个表的TABLE_info

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   | [email protected] | yes  | 1 
8 | 1  | Another E-mail | [email protected] | no  | 3 

当我从数据库中获取这些值,如何有效地设置一个PHP对象或这个值的数组。
我试着做一个mysql_query,并用这个结果在对象中做一个循环,并且对于任何一行,都要为用户标识创建一个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行放在用户对象中。正确?
我只是好奇,如果这是一个很好的做法,或者我错了。
我希望这很清楚。
谢谢。

回答

1

基本上,是的。但是,您可以设置您的model以定义从user_infouser表中检索信息的方法。沿着这些路线的东西:

// 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 problem。在笨一个更好的选择可能是使用一个表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; 
} 

您将需要调整的具体细节,但希望这给地方开始。

+0

是的,正是我想要的,但是当我尝试列出多个用户(行)时,我需要实现一个循环吗?并为mysql发送的用户查询的每一行。 – Guilherme 2012-04-25 12:21:44

+0

是的。我已经更新了如何用单个查询检索行并清理结果的示例。希望这有助于! – rjz 2012-04-25 16:16:38

0

在使用代码codeIgniter时,在模型文件中创建一个函数并放入代码。然后,在控制器中,在模型中调用该函数并发送所需的参数。您正在使用codeigniter,那么您也必须遵循架构。

+0

我正在使用,这个函数在User_model中。我正在使用数据库类的活动记录! – Guilherme 2012-04-25 12:08:56

0

不要忘记,这样你就必须在用户对象中使用动态数组。而不是名为“电话”,“电子邮件”和其他,您可以访问为$用户 - >电话,$用户 - >电子邮件和其他(这是一个简单的,我认为一个很好的方式)字段,您必须创建动态包含$ info_name - > $ value的数组。在“用户”对象中,您必须创建额外的功能,它解析每个属性$ info_name。这更灵活,但更复杂。

所以我认为,你必须在灵活性和复杂性之间寻找金手段。

+0

谢谢,是一个很好的理想,但删除user_info的所有“动态”的想法,因为管理员用户可以更改每个值的字段信息名称。这就是为什么我放置另一个名为Order的字段来对这些信息进行排序,因为它可以由admin用户定义。 – Guilherme 2012-04-25 12:15:53