【问题标题】:Codeigniter active record left join issueCodeigniter 活动记录左加入问题
【发布时间】:2013-11-20 18:21:24
【问题描述】:

我有两个表“accounts_transactions”和“accounts_bills_transactions”。 我必须使用codeigniter的活动记录将这两个左连接。但是用于连接的键列的名称是不同的。所以我没有从输出中的左表中获取键列。我应该写什么查询来获取键结果中包含左表中的列。 我的代码是

    $this->db->select('*');
    $this->db->from('accounts_transactions');
    $this->db->join('accounts_bills_transactions', 'accounts_transactions.id = accounts_bills_transactions.transaction_id','left');
    $query = $this->db->get();

所以,如您所见,此处用于连接的关键列是左表中的 id 和第二张表中的 transaction_id。问题是我没有从结果中获取左表中的 id。但我得到了所有其他的列。我认为问题是因为用于加入的列名不同。即两个列名都没有命名为 'id' 。那么我怎样才能从结果中包含的左表中获取 id。

【问题讨论】:

  • 这是正确的吗? account_transactions.id = accounts_transactions.transaction_id,不就是accounts_transactions.id = accounts_bills_transactions.transaction_id,你们是在同一张桌子上加入的……
  • 是的,这是一个错字,我需要的查询是 accounts_transactions.id = accounts_bills_transactions.transaction_id 并且它正在生成模棱两可的列错误

标签: php mysql codeigniter activerecord left-join


【解决方案1】:

你可以给它们起别名:

$this->db->select('accounts_transatctions.*, account_transactions.id AS a_id,
                   accounts_bills_transactions.*, 
                   account_bills_transactions.id AS ab_id');
$this->db->from('accounts_transactions');
$this->db->join('accounts_bills_transactions', 'accounts_transactions.id = accounts_transactions.transaction_id','left');
$query = $this->db->get();

这两个 ID 现在将以 a_idab_id(或您选择的任何别名)的形式提供

注意:我不确定您是否可以在 AR 中使用别名而不避免转义(有一段时间没有使用 CI)。如果您因此遇到任何错误,只需将false 作为$this->db->select() 的第二个参数传递:

$this->db->select('...', false);

【讨论】:

  • 您可以尝试列出您选择的所有列。您还确定您的查询没问题吗?我的意思是,也许你不想要一个 LEFT 加入...
  • 我绝对需要左连接:)
【解决方案2】:

如果你对使用 $this->where 或 $this->join 感到困惑,可以试试这个

$query = $this->db->query("select ......"); 

return $query;

【讨论】:

    【解决方案3】:

    你的问题很简单。你可以使用这个查询

    $query  =   $this->db
                    ->select('at.*')
                    ->select('abt.id as abt_id');
                    ->from('accounts_transactions at');
                    ->join('accounts_bills_transactions abt', 'at.id = abt.transaction_id','left');
                    ->get()
                    ->result();
    

    当在连接中使用相同的列时,它只选择一个。您需要将 alise 提供给第二个表中的另一列。最佳做法是使用这样的结构

    accounts_transatctions
    --------------------------
    accounts_transatctions_id
    other_columns
    
    accounts_bills_transactions
    ---------------------------
    accounts_bills_transactions_id
    accounts_transatctions_id
    other_columns
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      相关资源
      最近更新 更多