2012-04-06 36 views
14

Tôi đang xây dựng một truy vấn liên quan đến JOIN. Đây là lần đầu tiên tôi đã thực hiện công cụ db với Active Record và tôi đã đạt một chút của một snag.Tên miền ActiveRecord ActiveRecord trong câu lệnh JOIN

Tôi muốn tham gia vào một bảng gọi là companies vào bảng users để tôi có thể có được tên của công ty vv người dùng là tại tôi đã thực hiện loại này thành công như vậy:.

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; 
} 

Tuy nhiên vấn đề là các trường trong companies, chúng là idname được trả lại trong đối tượng đó đơn giản được gọi là name.

Thông thường khi tôi viết truy vấn thô, tôi sẽ cung cấp bí danh cho các bảng và kết quả sẽ là một cái gì đó như u.company_id, c.name. Vì vậy, tôi biết name không có gì để làm với người dùng nhưng tất nhiên là tên của công ty. Và mặc dù không phải là vấn đề hiện tại nhưng có khả năng trong tương lai, cột id rõ ràng không thể cùng tồn tại trong tập hợp kết quả, vì vậy một người bị ghi đè!

Làm cách nào chúng ta có thể nhận được loại phân biệt này giữa các trường đến từ một số bảng nhất định? Hoặc là có một cách tốt hơn để đi về tham gia bàn và làm việc với bộ dữ liệu truy vấn tham gia/đối tượng?

Edit:

Nếu tôi đã làm nó như một truy vấn liệu anh sẽ làm:

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'; 

Mà là tuyệt vời nhưng nếu tôi cố gắng để làm điều đó trong hồ sơ hoạt động Tôi nghĩ đó là thực tế khá nghèo , nếu nó hoạt động chút nào.

Trả lời

36

Nếu bạn muốn chọn một số cột cụ thể từ việc sử dụng bảng db->select(). Bạn có thể đặt bí danh cho bảng, thêm một số điều kiện và v.v. Gửi thông số thứ hai FALSE để không thoát khỏi các ký tự đặc biệt.

$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(); 
+0

Tôi nghĩ mình có thể phải sử dụng điều này, nhưng tôi không tự tin rằng tôi có thể chọn như thế. Làm thế nào để cung cấp cho bí danh cho các bảng như ví dụ của tôi sau đó, một cái gì đó như '-> get ('người dùng AS u')'? Điều này có tương thích với tất cả các mục tiêu cơ sở dữ liệu activerecord không? – deed02392

+0

@ deed02392 kiểm tra, cập nhật mã – safarov

+0

OK đúng như tôi nghĩ. Toán tử 'AS' là quyền SQL chuẩn, nó đặt bí danh trong tất cả các ngôn ngữ db? Hoặc điều này sẽ chỉ hoạt động trong certiain db's. – deed02392

Các vấn đề liên quan