2012-02-22 38 views
1

停止過濾所以我有一個變量,一個記錄:如何持續在一個記錄或集合

$firstRecordID = 1; 
$records = Recordset::all(); 

我要篩選的記錄:

$filteredRecords = $records->find(function($record) use ($firstRecordID){ 
    return ($record->id == $firstRecordID); 
}); 

在這個例子中,假設記錄ID是主鍵,只有一行會返回,但是,我認爲過濾器將繼續進行。

我的問題是,如何在滿足特定條件後強制過濾器停止?

編輯:我會添加其他更復雜的例子:

$filteredRecords = $records->find(function($record) use ($lastRecordID){ 
    $conditions == $records->conditions; 
    // in here I would find some value 
    // based on some other unknown record based on the $conditions 

    // if the value matches any of the $conditions return the row 
    // if the value matches a specified stop condition 
    // (which is defined by the user) stop retrieving rows. 
}); 
+0

這一切都取決於find()方法中的代碼,您已經如此周到地提供了....哦!它在哪裏? – 2012-02-22 07:38:36

+0

@Mark Ba​​ker我相信它在第二個代碼塊中,位於大括號之間。如果你指的是查找方法的實際定義,我相信我用鋰標記了問題,這意味着代碼在git中。感謝諷刺,它確實沒有幫助,或者對這件事情有意義。 – 2012-02-22 10:50:37

+0

當然,更好的選擇是首先檢索你想要的記錄,而不是檢索所有記錄,然後過濾 – 2012-02-22 11:04:59

回答

0

我認爲解決方案是第一個($過濾器)使用

$filteredRecords = $records->first(function($record) use ($firstRecordID){ 
    return ($record->id == $firstRecordID); 
}); 

http://li3.me/docs/lithium/util/Collection::first

+0

如果集合總是被排序,那麼首先肯定會工作,我一直在尋找1的ID,但是如果它是3呢?我需要停止的原因是因爲我從用戶定義的需求中抽取邏輯,這些需求可以動態改變。 – 2012-02-22 10:48:12

+1

@ ton.yeung閱讀Tomen鏈接的文檔。 'Collection :: first'返回第一個過濾器匹配;它與'Model :: first'不一樣。處理將在過濾器返回true時停止。 – benzado 2012-02-22 17:22:39

+1

我的錯誤,Tomen和@benzado,你們是絕對正確的。儘管我簡化了我的問題,那麼你會介意我剛剛在OP中留下的評論嗎?我澄清了爲什麼我問這個問題,這可以解釋爲什麼這不起作用。我想在一個堅果殼裏,我想在條件滿足後停止迭代。 – 2012-02-22 18:09:49

-1

簡答

在過濾器內部拋出異常並將其捕獲在外部。您可能必須自己收集陣列中包含的項目,因爲您無法訪問find的返回值。

龍答案

你過分集中於某一特定的戰術時,它可能對你有好處退一步,考慮你正在試圖完成的任務(使用過濾器阻止find)。

這聽起來像是你想要吃你的蛋糕並且擁有它:你想變得靈活並且在一個你可以很容易地改變的函數中指定你的搜索條件,但是你也想要有效率而不是拉更多的數據超出你的數據庫範圍。

的事情是,通過一個過濾器功能分爲find已經是低效率的,你可以得到它,因爲LI3將不得不拉每個記錄從數據庫之前,你的過濾器甚至稱。 這就是效率低下的地方。一旦你擊中了10個物品或任何不會造成太大差別的停止過濾過程(除非你的過濾也非常昂貴)。

我建議以下思路:

  1. 你真的需要讓任何過濾器的方法呢?是否可以使用聲明性條件?如果是這樣,您可以提供limit選項並讓數據庫完成所有工作。

  2. 如果您不能,請考慮使用find來獲取一小批記錄並收集您想保留在數組中的記錄。重複另一個小批量,直到檢查完數據庫中的每個項目或填充陣列。

+0

我在現有的記錄集上運行查找方法,所以如果我的表有10000行,而我的記錄集有50,它只會迭代超過50是我以爲它的工作原理。由於在這種情況下查找不是靜態的。 – 2012-02-24 00:10:40

+0

你的過濾有多貴?你不能只過濾一組50個,然後拿出前10個結果? – benzado 2012-02-24 02:01:13

+0

我認爲這是關閉trac。我沒有試圖完成分頁。我需要返回一個結果集,以確定它們是否顯示的條件是動態的並嵌入到結果集本身中。我不知道設計時的條件如何,因此業務邏輯會提取過濾器中的條件並確定是否應顯示該行。 – 2012-02-24 06:00:13