18

JOIN を含むクエリを作成しています。Active Record で db を扱うのはこれが初めてで、ちょっとした障害にぶつかりました。

companiesユーザーがいる会社の名前などを取得できるように、テーブルに呼び出されたテーブルに参加したいのですが、users次のように成功しました。

function get_profile_by_username($username)
{
    $this->db->join('companies', $this->table_name.'.company_id = companies.id');
    $this->db->where('LOWER(username)=', strtolower($username));
    $query = $this->db->get($this->table_name);
    if ($query->num_rows() == 1) return $query->row();
    return NULL;
}

ただし、問題は、 のフィールドが でcompaniesあり、id単にnameと呼ばれるオブジェクトに返されることnameです。

通常、生のクエリを作成する場合、テーブルにエイリアスを指定すると、結果は , のようu.company_idになりc.nameます。したがってname、ユーザーとは何の関係もないことはわかっていますが、もちろん会社の名前です。現在は問題ではありませんが、将来的には問題になる可能性がありますが、id列は明らかに結果セットに共存できないため、上書きされます。

特定のテーブルに由来するフィールドをこのように区別するにはどうすればよいでしょうか? または、テーブルの結合と、結合されたクエリ データ セット/オブジェクトを操作するためのより良い方法はありますか?

編集:

生のクエリとして実行していた場合は、次のようにします。

SELECT u.id, u.username, c.name
FROM users AS u
JOIN companies AS c
ON c.id = u.company_id
WHERE u.username = 'foobar';

これは素晴らしいことですが、アクティブなレコードでそれをやろうとした場合、それがうまくいくとしても、それはかなり貧弱な方法だと思います。

4

2 に答える 2

43

テーブルから特定の列を選択したい場合は、 を使用しますdb->select()。テーブルにエイリアスを与えたり、いくつかの条件を追加したりできます.2番目のパラメータを送信FALSEして、特殊文字をエスケープしないようにします.

$this->db->select('u.id, u.username, c.name', false);
$this->db->from('user as u');
$this->db->join('companies as c', 'u.company_id = c.id');
$this->db->where('LOWER(u.username)=', strtolower('foobar'));
$query = $this->db->get();
于 2012-04-06T17:50:37.957 に答える