2012-11-18 26 views
6

Tôi có một truy vấn các điều kiện của nó dưới đây (trừ lựa chọn, từ, vv)CodeIgniter DB Query với nơi, hoặc, và .. và như

$this->db->where('show_year', $yyyy); 
$this->db->or_where('idn', $idn); 
$this->db->or_like('post_slug', $idn); 

mà tạo

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
OR `idn` = 'the' 
AND `post_slug` LIKE '%the%' 

Tuy nhiên Tôi muốn có nó giống như

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
AND (`idn` = 'the' OR `post_slug` LIKE '%the%') 

Vấn đề của tôi là không chắc liệu hồ sơ hoạt động của CI có hỗ trợ quan niệm này không, và nếu có, Tôi giải quyết nó, vì tôi không thể tìm thấy khái niệm về nó ở bất cứ đâu trong tài liệu. Bất kể tôi thay đổi số like, or_like, where, or_where Tôi thậm chí không thể làm được điều gì đó tương tự. Vì vậy, bất cứ ai có bất kỳ ý tưởng? Tôi muốn tránh xa một truy vấn thô nếu có thể, nhưng nếu tôi phải chuẩn bị một và làm theo cách đó, tôi sẽ không thích.

+0

Tôi nghĩ rằng câu trả lời này có thể giúp đỡ, http://stackoverflow.com/questions/11937867/nested-where-clauses-codeigniter-mysql- truy vấn/11940789 # 11940789 chỉ cần ném phần '(...)' bên trong một '$ this-> db-> where()' gọi dưới dạng một chuỗi (với '()' s) – complex857

+0

Tôi nghĩ bạn có thể đang ở trên một cái gì đó với cái đó. Hy vọng rằng có một phương tiện để nó vẫn được chia nhỏ thành từng phần để làm cho nó dễ dàng thay đổi theo thời gian như được tinh chế của nó, và chạy xuống dòng để xây dựng toàn bộ truy vấn trong toàn bộ các điều kiện ngẫu nhiên, nhưng nếu đây là trường hợp duy nhất Bị mất nó, tốt tìm thấy – chris

Trả lời

2

Bạn đã thử cái này chưa?

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' AND `idn` = 'the' 
OR `show_year`='2009' AND `post_slug` LIKE '%the%' 

Tôi nghĩ rằng những điều sau đây tạo ra biểu thức trên:

$this->db->select(...)->from(...)-> 
where("show_year","2009")->where("idn","the")-> 
or_where("show_year","2009")->like("post_slug","%the%") 
+1

Trộn 'AND' và' OR' mà không có dấu ngoặc đơn có lẽ là một ý tưởng tồi từ một quan điểm dễ đọc/bảo trì ngay cả khi phân phối hoạt động như dự định bây giờ. Tốt hơn hãy chơi nó an toàn và sử dụng mệnh đề [DNF] (http://en.wikipedia.org/wiki/Disjunctive_normal_form) hoặc [CNF] (http://en.wikipedia.org/wiki/Conjunctive_normal_form). – complex857

+0

Tôi biết nhưng với AR của CI không thể làm dấu ngoặc đơn. Nó chỉ là một cách giải quyết (n xấu xí). Kiểm tra tùy chọn toán tử trong mysql: http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html - mysql đánh giá 'AND' đầu tiên sau' OR'. – uzsolt

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