Gần hai năm sau, tôi đã tìm thấy câu hỏi này. Một số đồng nghiệp của tôi đã trả lời với một số ưu điểm hoặc nhược điểm, tôi chỉ muốn thêm một ý kiến bởi kinh nghiệm cá nhân của tôi:
Như đã nói, tôi cũng trộn lẫn một số lần truy vấn , lý do là nó rất đơn giản để sử dụng nó khi bạn cần một phương thức nhận được rất nhiều tham số os và thay đổi truy vấn cho phù hợp. Ví dụ, tôi có một phương pháp tiếp nhận một loạt các thông số gọi là 'lựa chọn':
if(!empty($options['login']))
{
$this->db->where('tl.login', $options['login']);
}
if(!empty($options['ip']))
{
$this->db->where('tl.ip', $options['ip']);
}
if(!empty($options['sucesso']))
{
$this->db->where('tl.sucesso', $options['sucesso']);
}
if(isset($options['usuarios_existentes']) && $options['usuarios_existentes'])
{
$this->db->join('usuario u', 'tl.login = u.login');
}
else
{
$this->db->join('usuario u', 'tl.login = u.login', 'LEFT');
}
if(!empty($options['limit']))
{
$this->db->limit($options['limit']);
}
else
{
$this->db->limit(50);
}
return $this->db->select('tl.id_tentativa_login, tl.login, DATE_FORMAT(tl.data, "%d/%m/%Y %H:%i:%s") as data, tl.ip, tl.sucesso', FALSE)
->from('logs.tentativa_login tl')
->order_by('tl.data', 'DESC')
->get()->result();
Tất nhiên nó chỉ là một ví dụ đơn giản, nhưng tôi đã xây dựng các phương pháp với hàng trăm đường dây và điều kiện mà có thể thay đổi một chung ' có được 'phương pháp, và hồ sơ hoạt động làm cho nó thực sự tốt đẹp và rất dễ đọc vì bạn không cần phải viết mã ở giữa của nó để định dạng truy vấn đúng.
Bạn thậm chí có thể tham gia và các nội dung khác có thể có điều kiện. Vì vậy, bạn có thể sử dụng phương pháp tập trung chung, bằng cách tránh viết lại hầu hết mã và sao chép các phần của nó (khủng khiếp để bảo trì). , nhưng nó vẫn không ngừng truy vấn của bạn nhanh chóng vì chỉ tải những gì bạn cần:
if(!empty($opcoes['com_maquina']))
{
if(strtoupper($opcoes['com_maquina'])=='SIM')
{
$this->db->join('maquina m', 'm.id_local = l.id_local');
}
elseif(strtoupper($opcoes['com_maquina'])=='NAO')
{
$this->db->join('maquina m', 'm.id_local = l.id_local', 'LEFT');
$this->db->where('m.id_maquina IS NULL');
}
}
Một điểm tốt cho activerecord, là nó chấp nhận SQL tinh khiết trong các báo cáo, như truy vấn con và các công cụ khác, vì vậy bạn có thể sử dụng nó như bạn xin vui lòng.
Tôi đang nói về những lợi thế, tuy nhiên, rõ ràng là SQL thuần túy sẽ luôn được thực hiện nhanh hơn và sẽ không có chức năng gọi điện. nhưng để nói sự thật, trong hầu hết các trường hợp, trình phân tích cú pháp php sẽ làm điều đó nhanh đến nỗi nó sẽ không ảnh hưởng đến kết quả cuối cùng theo cách biểu cảm, và nếu bạn phải thực hiện rất nhiều điều kiện thủ công, mã của bạn có thể chậm như activerecord phân tích cú pháp anyway. Chỉ cần lưu ý rằng đôi khi truy vấn activerecord sẽ không hoạt động theo cách bạn mong đợi, bởi vì nó cố gắng xây dựng truy vấn một cách hợp lý mà nó đã được lập trình để làm, vì vậy hãy cẩn thận khi sử dụng câu lệnh 'OR', ví dụ, thời gian bạn phải cách ly nó (và):
$this->db->where('(m.ultimo_status < DATE_ADD(NOW(), INTERVAL -2 HOUR) OR m.ultimo_status IS NULL)');
Nếu bạn không thêm dấu(), thì nguyên tắc OR sẽ ảnh hưởng đến toàn bộ mệnh đề where. Vì vậy, một khi bạn đã quen với activerecord, nó có thể giúp rất nhiều và vẫn thực hiện các truy vấn nhanh và dễ đọc.
vui lòng bất cứ khi nào bạn đăng câu hỏi, chấp nhận câu trả lời thỏa mãn bạn. –
Hi Raheel, tôi thường chấp nhận câu trả lời khi có câu trả lời để chấp nhận. Tôi không hoàn toàn chắc chắn cái nào để chấp nhận, vì không ai thực sự trả lời câu hỏi của tôi theo ý thích của tôi. Bạn đề nghị tôi chấp nhận cái nào? –
Tôi đề nghị @tomexsans hợp lý hơn nên tôi có thể nói rằng anh ấy nên được chấp nhận. Ông là đúng về tiêu thụ bộ nhớ cũng là một điểm cần lưu ý là chạy thêm chức năng php để xây dựng truy vấn làm cho quá trình chậm không nhanh –