Yii中

2014-03-01 19 views
0

遞歸找到嵌套活動記錄關係假設你有類似下面的關係,要找到與特定客戶下的所有賬戶:Yii中

- Customer 1 
    - accounts 
     - Account 1 
    - customers 
     - Customer 2 
      - accounts 
       - Account 2 
       - Account 3 
     - Customer 3 
      - customers 
       - Customer 4 
        - accounts 
         - Account 4 
         - Account 5 

(對於客戶1,這是佔1, 2,3,4和5;對於客戶3,它是賬戶4和5;等等)

你會怎麼做?

這已經在我的項目中出現了幾次,我很好奇別人怎麼解決它。

這裏的gist of my solution(在鏈接代碼中的註釋):

<?php 
public function getNestedRelated($nested, $from, $nestedCriteria = array(), $fromCriteria = array(), $maxLevels = false, $includeFirst = true, $_currentLevel = 0, &$_recursedSoFar = array()) 
{ 
    // Always return an array (for array_merge) 
    $related = array(); 

    // Prevent infinite recursion 
    if (in_array($this->primaryKey, $_recursedSoFar)) { 
     return $related; 
    } 
    $_recursedSoFar[] = $this->primaryKey; 

    // Nested records at this level 
    if ($_currentLevel > 0 || $includeFirst) { 
     // Whether to refresh nested records at this level. If criteria are 
     // provided, the db is queried anyway. 
     $refreshNested = false; 
     $related  = $this->getRelated($nested, $refreshNested, $nestedCriteria); 
    } 

    // Handle singular ("HAS_ONE", "BELONGS_TO") relations 
    if (!is_array($related)) { 
     $related = array($related); 
    } 

    // Don't recurse past the max # of levels 
    if ($maxLevels !== false && $_currentLevel > $maxLevels) { 
     return $related; 
    } 

    // Whether to refresh children of this record. If criteria are provided, 
    // the db is queried anyway. 
    $refreshFrom = false; 

    // Go down one more level 
    $_currentLevel++; 
    foreach ($this->getRelated($from, $refreshFrom, $fromCriteria) as $child) { 
     // Recursive step 
     $nestedRelated = $child->getNestedRelated($nested, $from, $nestedCriteria, $fromCriteria, $maxLevels, $includeFirst, $_currentLevel, $_recursedSoFar); 
     $related  = array_merge($related, $nestedRelated); 
    } 
    return $related; 
} 

回答

0

你有沒有想過使用序拿到1所有的細節去了?如果可能的話,將帳戶和客戶都保存在一張表中,然後使用預訂功能進行1次查詢實際上可以獲得所需的一切。

如果您將客戶和帳戶保存在兩張不同的表格中,我相信您仍然可以使用預訂來最大限度地減少查詢的次數。

我在Yii中使用這個擴展也保持預定的東西,這是相當不錯的http://www.yiiframework.com/extension/nestedsetbehavior/