Laravel 5.7. Построение метода доступа «Путь к домену» с помощью запроса доменов для рекурсивного получения домена и его родительских идентификаторов. - PullRequest
0 голосов
/ 17 января 2019

Это приложение позволяет пользователям вкладывать домены. Домен - это просто красноречивая модель с идентификатором, строковым столбцом, который является именем домена, и parent_id, который связывает его с другим доменом как «дочерний» или «поддомен». Теоретически, пользователь может вкладывать деньги настолько глубоко, насколько это необходимо. Я пытаюсь создать метод доступа к доменному пути, который будет напоминать URL. Что-то вроде. ParentMostDomain/NextChildDomain/AnotherChildDomain/ChildMostdomain, где каждый из родителей домена является строковым именем. В модели, в которой будет работать метод доступа, хранится domain_id, который является дочерним доменом, и отношение для доступа к полной модели домена. На модели Domain я создал отношения parentDomain и parentDomainsRecursive примерно так:

/**
 * Relationship to the domain the Model is in relation to
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function parentDomain()
{
    return $this->belongsTo(Domain::class, 'parent_id', 'id');
}

/**
 * Recursive Parent Domains
 *
 * @return \App\Models\Domain
 */
public function parentDomainsRecursive()
{
    return $this->parentDomains()->with('parentDomainsRecursive');
}

А доступ имеет к домену: $this->domain->parentDomainsRecursive. У каждого домена есть имя, и это то, что я бы использовал, чтобы построить domain_path от самого родителя до самого ребенка. Пока все это кажется правильным, но по какой-то причине я не могу обернуться, просматривая все эти вложенные домены, начиная с самого ребенка. Любые мысли будут очень цениться! Мой аксессуар (не симпатичный) пока:

/**
 * Domain Path Attribute
 *
 * @return mixed
 */
public function getDomainPathAttribute()
{
    dd($this->domain->parentDomainsRecursive);
    $domainPath = '';
    foreach ($this->domain->parentDomainsRecursive as $domain) {
        if ($domain) {
            $domainPath . $domain->domain . '\\';
        }
    }

    return $domainPath . '//' . $this->domain->domain;
}

Это dd($this->domain->parentDomainsRecursive); выглядит примерно так:

"domain": {
    "id": "451d35ee-4690-45a7-944c-8804ecfb759a",
    "parent_id": "762db7de-0d01-4c87-95c5-b7bb52db3e38",
    "name": "Fundamental grid-enabled artificialintelligence",
    "created_at": "2019-01-16 21:54:53",
    "updated_at": "2019-01-16 21:54:53",
    "deleted_at": null,
    "parent_domains_recursive": {
        "id": "762db7de-0d01-4c87-95c5-b7bb52db3e38",
        "parent_id": "a441e544-649c-4df5-8b42-2e731b19a85a",
        "name": "Reduced modular budgetarymanagement",
        "created_at": "2019-01-16 21:54:52",
        "updated_at": "2019-01-16 21:54:52",
        "deleted_at": null,
        "parent_domains_recursive": {
            "id": "a441e544-649c-4df5-8b42-2e731b19a85a",
            "parent_id": null,
            "name": "Multi-lateral eco-centric orchestration",
            "created_at": "2019-01-16 21:54:52",
            "updated_at": "2019-01-16 21:54:52",
            "deleted_at": null,
            "parent_domains_recursive": null
        }
    }
}

У самого родителя есть ноль parent_id. В приведенном выше примере URL-адрес, который я хочу получить с помощью этого метода доступа, будет Multi-lateral eco-centric orchestration/Reduced modular budgetarymanagement/Fundamental grid-enabled artificialintelligence.

1 Ответ

0 голосов
/ 17 января 2019

Закончилось решение этой проблемы рекурсивным методом:

public function getDomainPath($domainId)
{
    $domain = Domain::findOrFail($domainId);
    if (is_null($domain->parent_id)) {
        return $domain->domain;
    }
    $path = $this->getDomainPath($domain->parent_id) . '/' . $domain->domain;
    return $path;
}

Затем я вызываю метод в методе доступа и передаю идентификатор самого дочернего домена.

...