Отображение элементов в отношениях второго уровня в Nova Laravel с использованием indexQuery - PullRequest
0 голосов
/ 08 января 2020

У меня есть 3 модели

Пользователь имеет отношение hasmany (domains ()) с Domain , и это отношение hasMany (почтовые ящики) с Mailbox

Пользователь. php

public function domains()
{
    return $this->hasMany(Domain::class);
}

Домен. php

public function user()
{
    return $this->belongsTo(User::class);
}

public function mailboxes()
{
    return $this->hasMany(Mailbox::class, 'domain', 'domain');
}

Почтовый ящик. php

public function domains()
{
    return $this->belongsTo('App\Domain', 'domain', 'domain');
}

Приведенный ниже код отлично работает для получения только принадлежащих почтовых ящиков, но если поместить его в политики, не работает.

public function view(User $user, Mailbox $mailbox)
{
    $domains = Domain::where('user_id', $user->id)->pluck('domain')->toArray();

    return User::with([
        'domains.mailboxes' => function ($builder) use ($domains) {
            $builder->where('domain',$domains);
        }
    ])->find($user);

}

Я попытался переопределить indexQuery для моей модели Nova / Mailbox, но не работает. Восстановить все почтовые ящики в базе данных

public static function indexQuery(NovaRequest $request, $query)
{

    $domains = Domain::where('user_id', $request->user()->id)->pluck('domain')->toArray();

    return User::with([
        'domains.mailboxes' => function ($builder) use ($domains) {
            $builder->where('domain',$domains);
        }
    ])->find($user);

    if ($request->user()->is_super_admin) {
        return $query;
    } else {
        return User::with([
            'domains.mailboxes' => function ($builder) use ($domains) {
                $builder->where('domain',$domains);
            }
        ])->find($user);
    }
}

1 Ответ

0 голосов
/ 15 февраля 2020

Я бы добавил hasManyThrough ( документация ) между пользователем и почтовым ящиком, чтобы вы могли извлекать почтовые ящики непосредственно из модели пользователя:

# Inside User model class
public function mailboxes()
{
    return $this->hasManyThrough(Mailbox::class, Domain::class, 'user_id', 'domain', 'id', 'domain');
}

Затем в своем индексе может вернуть пользователя со всеми его почтовыми ящиками:

public static function indexQuery(NovaRequest $request, $query)
{
    return $query->when(! $request->user()->is_super_admin, function ($builder) use ($request) {
        // Or use the request() method helper instead of use
        return $request->user()->with('mailboxes');
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...