Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Codeigniter中连接同一个表两次并分配表别名?_Php_Mysql_Codeigniter_Join_Pyrocms - Fatal编程技术网

Php 如何在Codeigniter中连接同一个表两次并分配表别名?

Php 如何在Codeigniter中连接同一个表两次并分配表别名?,php,mysql,codeigniter,join,pyrocms,Php,Mysql,Codeigniter,Join,Pyrocms,我想用PyroCms在Codeigniter中制作一个邮件系统。 在我的邮件表中,我有一个“recipent”行和一个“sender”行,其中包含发件人和收件人的用户id。为了从ID中检索用户名,我尝试将表连接在一起,但它只是返回以下错误: 错误号码:1066 非唯一表/别名:“默认用户” 文件名:/hsphere/local/home/brightmedia/reuseable.dk/modules/mail/models/mail_m.php 电话号码:13 我的代码如下: $this-&g

我想用PyroCms在Codeigniter中制作一个邮件系统。 在我的邮件表中,我有一个“recipent”行和一个“sender”行,其中包含发件人和收件人的用户id。为了从ID中检索用户名,我尝试将表连接在一起,但它只是返回以下错误:

错误号码:1066

非唯一表/别名:“默认用户”

文件名:/hsphere/local/home/brightmedia/reuseable.dk/modules/mail/models/mail_m.php

电话号码:13

我的代码如下:

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
    ->join('users', 'mailsystem.recipent = modtager.id', 'left')
    ->join('users', 'mailsystem.sender = afsender.id', 'left');
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

有趣的是,如果我删除了最后一个“join”操作,只让它加入邮件的收件人,那么一切都会很好。

您是否尝试过在join函数中强制使用别名(“AS”操作符在select子句中不起作用

这很简单

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND mailsystem.sender = afsender.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();
您可以使用以下选项:

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND mailsystem.sender = afsender.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();
*如果您使用的是任何db前缀,请使用此*

使用这样的别名-

$this->db->select('mailsystem.*, users_table_a.username AS modtager, users_table_b.username as afsender')
$this->db->join('users users_table_a', 'mailsystem.recipent = users_table_a.id', 'left');
$this->db->join('users users_table_b', 'mailsystem.sender = users_table_b.id', 'left');
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

在执行此线程时,我发现codeigniter调用忽略了在联接内部执行
的可能性,因此解决了以下问题:

$sql = "
    SELECT default_mailsystem.*,
           recipent.first_name AS modtager, 
           sender.first_name AS afsender
    FROM default_mailsystem
    LEFT JOIN default_profiles AS recipent ON recipent.id = default_mailsystem.id
    LEFT JOIN default_profiles AS sender ON sender.id = default_mailsystem.id
";
return $this->db->query($sql)->result();

虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请您的回答添加解释,并说明适用的限制和假设。此回答不试图强调OP的数据/值。看起来,这个代码唯一的答案更像是回答了一个需要相同技术的不同问题。手动添加反勾号违背了ActiveRecord方法为您提供标识符转义的功能(在移动到其他数据库时仍然有效)。换句话说,使用查询生成器方法的想法是,您不需要手动引用查询的部分内容。这个答案会误导那些想将同一个表加入第一个表两次的研究人员。这个答案缺少解释。此“代码块”答案将要求研究人员滚动并仔细检查OP的代码和您的代码。此“使用此”(无解释)答案不是将同一个表连接到父表两次,而是将一个表连接到父表一次。@mickmackusa已按要求提交,现已更新。此答案不喜欢CI的查询构建方法。
$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND '.$this->db->dbprefix('mailsystem').'.sender = '.$this->db->dbprefix('afsender').'.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();
Its very easy to get data from single table
$this->db->select('a.*,b.fname AS cname,c.fname as uname'); 
$this->db->from('tbl_menus a'); 
$this->db->join('tbl_admin_login b', 'b.id = a.create_by', 'left'); 
$this->db->join('tbl_admin_login c', 'c.id = a.update_by', 'left'); 
$this->db->order_by('a.id', 'desc'); 
return $this->db->get()->result_array();
$this->db->select('mailsystem.*, users_table_a.username AS modtager, users_table_b.username as afsender')
$this->db->join('users users_table_a', 'mailsystem.recipent = users_table_a.id', 'left');
$this->db->join('users users_table_b', 'mailsystem.sender = users_table_b.id', 'left');
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();
$sql = "
    SELECT default_mailsystem.*,
           recipent.first_name AS modtager, 
           sender.first_name AS afsender
    FROM default_mailsystem
    LEFT JOIN default_profiles AS recipent ON recipent.id = default_mailsystem.id
    LEFT JOIN default_profiles AS sender ON sender.id = default_mailsystem.id
";
return $this->db->query($sql)->result();