差不多兩年後,我發現了這個問題。我的一些同事已經回答了幾個優點或缺點,我只是想通過我的個人經驗添加一個意見:
正如有人所說,我也將使用活動記錄和純粹的直接sql混合起來用於非常複雜的查詢,原因是當你需要一個接收很多os參數並相應地改變查詢的方法時,它的使用非常簡單。舉例來說,我有一個接收的稱爲參數數組「選項」的方法:
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();
當然這只是一個簡單的例子,但我已經建造方法與數百行和條件可能會改變一個通用的' get'方法,並且活動記錄使其非常好,並且非常易讀,因爲您不需要在其中間編寫代碼來正確地格式化查詢。
你甚至可以有連接和其他可以有條件的東西,所以你可以使用一個通用的集中式方法,這樣可以避免重寫大部分代碼和複製部分代碼(可怕的維護),它不僅可讀,但它讓你的查詢速度快,因爲只加載你所需要的:
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');
}
}
換個好點的ActiveRecord的是,它接受純粹的SQL語句中的一樣,子查詢和其他的東西,所以你可以使用它作爲你請。
我在談論優點,但是,顯而易見的是,純SQL總是會執行得更快,並且不會有調用函數的開銷。但要說實話,在大多數情況下,php解析器會做得太快以至於不會以一種富有表現力的方式影響最終結果,並且如果您必須製作大量手動條件,則代碼可能與主動記錄一樣慢無論如何,解析器。
請注意,有時activerecord查詢不會按照您期望的方式工作,因爲它會嘗試以編程的邏輯方式構建查詢,所以在使用'OR'語句時要小心,大多數時間你必須隔離它(和):
$this->db->where('(m.ultimo_status < DATE_ADD(NOW(), INTERVAL -2 HOUR) OR m.ultimo_status IS NULL)');
如果你沒有添加(),OR的狀態會影響整個where子句。 因此,一旦你習慣了主動記錄,它可以幫助很多人,並且仍然可以快速和可讀的查詢。
只要您發佈問題,請接受您滿意的答案。 –
嗨拉希爾,我通常會在接受答案時接受答案。我不太確定哪一個可以接受,因爲我沒有真正回答我的問題。你建議我接受哪一個? –
嗯,我建議@tomexsans更明智,所以我可以說他應該被接受。他對消耗內存是正確的還有一點需要注意的是,運行額外的php函數來構建查詢會使進程變得緩慢不快 –