【问题标题】:Displaying multiple values from same name MySQL database field in Codeigniter & Dwoo在 Codeigniter 和 Dwoo 中显示来自同名 MySQL 数据库字段的多个值
【发布时间】:2010-07-18 04:35:37
【问题描述】:

我正在构建一个 Web 应用程序,并选择在我的应用程序中使用与 Wordpress 相似的表和字段名称。我的意思是我有一个用户表和一个用户元表,类似于 Wordpress 的工作方式。

请原谅我把这个问题提得这么大,我选择在这个问题中尽可能地描述性。

usermeta 表有以下表值;

umeta_id
用户ID
元密钥
元值

例如,我的 usermeta 表中有以下数据;

user_id = 1
元键 = 名字
meta_value = 'dwayne

user_id = 1
元键 = 姓氏
meta_value = charrington

在我的用户表中,我有以下示例数据;

ID = 1
user_login = 管理员
user_pass = ui3h423h4o82374
user_email = test@test.com

基本上我想做的是使用以下连接,这似乎有点工作,有点:

$db = $this->db;
$db->select('wolf_users.ID, wolf_usermeta.user_id AS ID', FALSE);
$db->select('wolf_users.user_login AS user_login', FALSE);
$db->select('wolf_users.user_email AS user_email', FALSE);
$db->select('wolf_users.user_status AS status', FALSE);
$db->select('wolf_usermeta.meta_key AS meta_key', FALSE);
$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
$db->from('wolf_users');
$db->join('wolf_usermeta', 'wolf_users.ID = wolf_usermeta.user_id', 'left');
$db->where('wolf_usermeta.user_id = wolf_users.ID');
$q = $db->get();
return $q->result_array();

首先:result_array 似乎从我的数据库中返回了重复数据(这有点奇怪)我是否错误地格式化了我的连接,或者我是否缺少一些东西来防止这种情况发生?仅使用 $q->result() 返回结果似乎停止返回重复数据。

我将 Dwoo 用于我的模板,当我使用 print_r 回显保存数据的变量时,它在使用查询时不显示重复的查询内容,但在使用 result_array 时显示重复的内容(几乎就像它在 usermeta 表上循环一样几次)。

我使用此数据库查询的页面之一是列出数据库中所有客户端的页面,然后从 usermeta 表中获取匹配数据。所以我的问题是如何访问两个表中的数据,然后在我的视图模板中使用 foreach 将其显示在我的应用程序中?

【问题讨论】:

    标签: sql mysql database codeigniter join


    【解决方案1】:

    您了解联接的工作原理吗?

    通过将元数据连接到用户,用户将针对您拉出的每个元数据条目重复。

    在从数据库中提取数据后使用 foreach 或将查询拆分为两个查询可以避免这种情况。

    $user = $this->db
        ->select('ID, user_login, user_email, user_status AS status')
        ->where('ID', $id)
        ->get('wolf_users')
        ->row_array();
    
    if(!$user)
    {
        return FALSE;
    }
    
    $user['meta'] = $this->db
        ->select('meta_key, meta_value')
        ->where('user_id', $id)
        ->get('wolf_usermeta')
        ->result_array();
    
    return $user;
    

    一些一般的 MySQL 要点和提示:

    wolf_users.ID, wolf_usermeta.user_id AS ID
    

    不需要,只需要选择一次用户ID。第二个选择会覆盖第一个,这当然是一样的。

    $db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
    

    您不需要这样做,表名将从结果中删除,因此重命名它们是没有意义的。

    祝你好运!

    【讨论】:

    • 哇,谢谢菲尔。我很高兴大家选择回答我的问题。我对整个 PHP 框架是半新的,并选择了 Codeigniter,因为它似乎是其他框架的不那么严格和真正强大的替代品。我已经做了几年 PHP 开发人员,令人惊讶的是,我从来没有使用过联接(我知道这听起来很糟糕),我决定是时候学习了。
    【解决方案2】:

    根据您的示例数据,您会期望出现两行;我不知道这是否是您所说的“重复数据”。这些行的不同之处在于它们的 meta_key 和 meta_value 值不同。

    如果在这些列中出现的行具有相同的值,您是否检查了 user_meta 表或用户表以检查它们中的任何一个都没有重复的行。您的表是否有唯一的键约束?

    我看不到您指定的 where 子句会影响查询,因为它与连接条件相同。

    【讨论】:

      【解决方案3】:

      我检查了两个数据库表,在两个表中都没有找到重复的行。我删除了 where 子句,因为我注意到 join 无论如何都会有效地做同样的事情,并且将它放在那里是多余的。

      我无法理解这里发生了什么。从我所看到的情况来看,我已经在我的联接中完成了所有事情,并且应该没有理由在查询输出中多次显示行(尽管事实上数据库中没有重复的行)。是否有更好的方法来构建表格以使我自己更轻松?

      我正在构建的应用程序需要某种自定义字段功能,例如我当前的 usermeta 表允许我在单独的表中进行操作,以保持一切清洁和分离。

      我也没有唯一键约束,但是将字段设置为唯一键会导致问题吗?我正在考虑让我的 user_login(用户名字段)成为唯一键以防止重复名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 2023-04-01
        • 1970-01-01
        • 2018-07-07
        • 2011-04-28
        • 1970-01-01
        • 2020-08-11
        相关资源
        最近更新 更多