2010-03-23 44 views
1

我是新來Doctrine和ActiveRecord。PHP原則:過濾已加載的數據?

如何過濾表格後加載?(我想這是優先於發送多個查詢?)

這是'好'還是'壞'?

class UserTable extends Doctrine_Table { 
    function filterByGroup($group) { 
     $ut = new UserTable(); 
     foreach($this as $u) { 
      if($u->group == $group) $ut->add($u); 
     } 
     return $ut; 
    } 
} 

編輯:

我知道有內置的功能,這提供商「過濾」功能。但是下面的兩個代碼塊在性能方面表現會有所不同嗎?

//1 
$users = Doctrine_Core::getTable('Users')->findAll(); 
$admins = Doctrine_Core::getTable('Users')->findByGroupName('admin'); 
//2 
$admins = Doctrine_Core::getTable('Users')->findByGroupName('admin'); 
$users = Doctrine_Core::getTable('Users')->findAll(); 

回答

2

首先,你的if語句將$ u-> group賦值給$ u,而不是將它們進行比較。注意=和==(和===)。

有內置的「findBy」功能可用(請參閱http://www.doctrine-project.org/Doctrine_Table/1_2#method_findby)做你想做的。您當然想要爲您要過濾的字段設置適當的索引。

在旁註中,您應該避免將單詞「group」用作字段,因爲它是一個SQL關鍵字。至少,將其命名爲「group_name」或其他。

無論如何,如果我明白你想要做什麼,你甚至不需要在你的UserTable類中添加一個函數。您可以直接從您的腳本中獲得經過篩選的值列表:

$users = Doctrine_Core::getTable('User')->findByGroupName($name); 
+0

抱歉在僞造錯誤的拼寫錯誤;),替換。請參閱最新的問題。我關心的是需要查詢的數量。如果只需要1個查詢,則意味着Doctrine會自動加載所有記錄,並在其內部結果上調用findBy函數。這涉及到我關於大型表......但是,如果使用多個查詢,那麼我的問題仍然有效,如何在表中使用「加載」結果並真正過濾這些結果? – Ropstah 2010-03-23 22:14:40

+0

findBy方法不會加載所有行,它會根據您指定的字段和值生成WHERE子句。我認爲不重要的是你打這些電話的順序,表現應該是一樣的。我認爲Doctrine_Collection中有一種方法可以過濾結果,但我在乍一看沒有在文檔中看到它。 – Jody 2010-03-24 14:05:14