【问题标题】:Join column from one table to another column in other table CodeIgniter将一个表中的列连接到另一个表中的另一列 CodeIgniter
【发布时间】:2019-07-03 18:41:22
【问题描述】:

我有 2 个表,我希望其中一些列在另一列从用户获取数据时自动更新。

这是我的场景:用户注册,他的详细信息转到“用户”表。 注册用户现在可以发帖了。当他发帖时,他的帖子会转到“帖子”表。

现在我想在用户发帖时显示用户“用户名”。

所以,结论是我希望“users”表中的“username”列自动与“posts”表中的“username”列同步。这样,一旦用户发布了帖子,它就会看到特定用户发布了帖子。

我将如何实现它

<?php foreach ($posts as $post) : ?>

    <div class="row">
        <div  class="col-md-3">
            <img class="post-thumb img-fluid" src="<?php echo site_url(); 
?>assets/images/posts/<?php echo $post['post_image']; ?>">
        </div>
        <div class="col-md-9">
            <h3><?php echo $post['title'];?></h3>
            <small class="post-date">Posted on: <?php echo 
$post['created_at']; ?>
                in <strong><?php echo $post['category_name']?></strong> by 
<strong><?php echo $post['username']?></strong></small><br>
            <?php echo word_limiter($post['body'], 50); ?>
            <br><br>
            <p><a class="btn btn-info" href="<?php echo 
site_url('/posts/'.$post['slug']);?>"
                >Read More</a></p>
        </div>
    </div>

<?php endforeach; ?>

这是我尝试过的一个功能,但在我发帖时它不会更新我的“帖子”表列“用户名”。

public function get_posts($slug = FALSE){
    if ($slug === FALSE){
        $this->db->order_by('posts.id', 'DESC');
        $this->db->join('categories', 'categories.id = 
posts.category_id');
        $this->db->join('users', 'users.username = posts.username');
        $query = $this->db->get('posts');
        return $query->result_array();
    }

    $query = $this->db->get_where('posts', array('slug' => $slug));
    return $query->row_array();
    }

这是数据库表

CREATE TABLE `posts` (
  `id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `username` varchar(255) NOT NULL,
  `posted_by` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `body` text NOT NULL,
  `post_image` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `register_date` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

没有错误,只是没有结果。

我们将不胜感激任何建议或帮助。

编辑:

我已经成功创建了一个“get_username”函数。但我不确定它为什么不起作用以及如何创建一个循环来循环浏览已发布的帖子。请看下面的代码

public function get_username(){
    $username = $this->db->query("
          SELECT u.username AS username
          FROM users u
          LEFT JOIN posts p 
          ON u.id = p.user_id
          WHERE p.id = ?"
        , array('id')
    )->row_array();
    return $username['username'];
 }

我收到错误提示:

A PHP Error was encountered
Severity: Notice

Message: Undefined index: username

Filename: posts/index.php

Line Number: 19

【问题讨论】:

  • 调试 sql 并在您的数据库中手动运行以确定问题: print_r($this->db->last_query());出口; // 把它放在返回之前 - 就像临时调试一样。
  • 我编辑了我的帖子,添加了两个数据库
  • $this->db->select('*');需要吗?
  • 没区别,试了一下
  • 您最初提到您想从帖子表中获取用户名。您能否在 phpMyAdmin 或您的数据库程序中确认 User_id 肯定已填充到您的帖子表中?也不要将用户名放在帖子表中。如果您允许用户更改其用户名 - 您将必须更新所有相应的记录。纯粹在 ID 上链接要好得多。我想你会发现posts.username 列是空的?

标签: php mysql sql codeigniter-3


【解决方案1】:

您的 get_username() 方法不带任何参数 - 如果您想获得 5 个中的 id 怎么办?或20?目前您无法指定 what id 进行查询。当前查询,结果:

LEFT JOIN posts p ON u.id = p.user_id WHERE p.id = 'id'

因为它传递了一个字面上称为id 的字符串,而您真正想要的是传递一个带有相关ID 的参数以进行查询。

/**
 *
**/
public function get_username( int $userId )
{
    $username = $this->db->query("
          SELECT u.username AS username
          FROM users u
          LEFT JOIN posts p 
          ON u.id = p.user_id
          WHERE p.id = ?"
        , array( $userId )
    )->row_array();
    return $username['username'];
 }

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2010-10-20
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2023-03-06
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多