将一个表中的列连接到另一表中的另一列CodeIgniter

时间:2019-07-03 18:41:22

标签: php mysql sql codeigniter-3

我有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; ?>

这是我尝试过的功能,但发布帖子时不会更新我的“ posts”表列“ username”。

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

1 个答案:

答案 0 :(得分:0)

您的get_username()方法不带任何参数-如果您想将id设为5,该怎么办?或20?当前,您无法指定要查询的内容 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'];
 }