Birkaç ActiveRecord tarz sorgu oluşturucu kitaplıkları orada vardır. Bazıları stand alone ve bazı built into frameworks gelir. Ancak, onlar gerçekten NEREDE ve karmaşık SQL gelince hükümler HAVING ile sorun var. Kenara diğer veritabanları ayarlama - Ben bu güncel yöntem düşüşlerine düzeltmek olabilir ki () yöntemi, MySQL ve PostgreSQL uyumlu ile gelip çalışıyorum.
Aşağıda şimdiye kadar ile gelebilir en iyi gösteren örnekler ve fikir uzun bir liste. Ancak, all of the use cases çözmek için görünmüyor olabilir ve benim kısmi bir çözüm özensiz olduğunu hissediyorum. Tüm bu sorunların çözer şey ile cevap verebilecek herkes, sadece bu soruya cevap olmayacak - ama şimdi birkaç yıl için PHP uygulamaları avlanan bir sorunu gidermekle sorumlu olacaktır.
Common Operators
= Equal
<> Not Equal
> Greater Than
< Less Than
>= Greater Than Or Equal
<= Less Than Or Equal
BETWEEN between values on right
NOT logical NOT
AND logical AND
OR logical OR
Example Where clauses
SELECT ... FROM table...
WHERE column = 5
WHERE column > 5
WHERE column IS NULL
WHERE column IN (1, 2, 3)
WHERE column NOT IN (1, 2, 3)
WHERE column IN (SELECT column FROM t2)
WHERE column IN (SELECT c3 FROM t2 WHERE c2 = table.column + 10)
WHERE column BETWEEN 32 AND 34
WHERE column BETWEEN (SELECT c3 FROM t2 WHERE c2 = table.column + 10) AND 100
WHERE EXISTS (SELECT column FROM t2 WHERE c2 > table.column)
Burada () yan farklı current kütüphanelerde kullandığı birçok ortak ActiveRecord formatları vardır.
$this->db->where(array('session_id' => '?', 'username' => '?'));
$this->db->fetch(array($id, $username));
// vs with is_int($key)
$this->db->where(array('session_id', 'username'));
$this->db->fetch(array($id, $username));
// vs with is_string($where)
$this->db->where('session_id', '?');
$this->db->where('username');
$this->db->fetch(array($id, $username));
// vs with is_array($value)
$this->db->where('session_id', '?');
$this->db->where('username', array('Sam', 'Bob'));
$this->db->fetch(array($id));
İşte ben bugüne kadar nihai biçimidir. Bu (...) AND (...)
yanı sıra hazır deyim bağlı params ("?" ": Isim" &) gruplandırma işlemek gerekir.
function where($column, $op = '=', $value = '?', $group = FALSE){}
// Single line
$this->db->where('column > 5');
$this->db->where('column IS NULL');
// Column + condition
$this->db->where('column', '=');
// WHERE column = ? (prepared statement)
$this->db->where('column', '<>');
// WHERE column <> ? (prepared statement)
// Column + condition + values
$this->db->where('column', '=', 5);
// // WHERE column = 5
$this->db->where('column', 'IN', '(SELECT column FROM t2)');
// WHERE column IN (SELECT column FROM t2)
$this->db->where('column', 'IN', array(1,2,3));
// WHERE column IN (1, 2, 3)
$this->db->where('column', 'NOT IN', array(1,2,3));
// WHERE column NOT IN (1, 2, 3)
// column + condition + values + group
$this->db->where(
array(
array('column', '<', 20),
array('column', '>', 10)
),
NULL,
NULL,
$group = TRUE
);
// WHERE (column < 20 AND column > 10)
:UPDATE:
Benim soru boyunca ben NEREDE ve sadece derin gitmek daha karmaşık koşullara sahip olduğunu fark geldi. Özellikleri soyut hatta% 80 çalışıyorum sadece WHERE ve HAVING için büyük bir kütüphanede neden olacaktır. Bill de işaret ettiği gibi, bu sadece PHP gibi bir betik dili için makul değildir.
Çözüm sadece sorgunun WHERE kısmını zanaat el etmektir. Sürece sütunları etrafında "
kullanmak gibi onlar hemen hemen aynı SQL sözdizimini kullanın Postgre'nin, SQLite, MySQL sorgu beri NEREDE aynı kullanabilirsiniz. (MySQL için yapmanız gerekir str_replace()
Onları bir kene ile `).
Soyutlama koşulları böyle bir yer vardır NEREDE yardımcı olur, daha fazla acıyor bir nokta vardır geliyor.