簡體   English   中英

在Yii中遞歸查找嵌套的活動記錄關系

[英]Recursively find nested active record relations in 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;等等。)

你會怎么做?

這在我的項目中已經出現過幾次了,我很好奇其他人如何解決它。

是我的解決方案要點 (鏈接中的代碼注釋):

<?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;
}

您是否考慮過使用預購功能一次性獲得所有詳細信息? 如果有可能,將帳戶和客戶都保留在1個表中,那么1個帶有預購的查詢實際上將獲得您需要的一切。

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

我在Yii中使用了這個擴展名,也可以使事情保持預定狀態,這非常不錯http://www.yiiframework.com/extension/nestedsetbehavior/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM