Nova Relatable Filtering - как фильтровать пользователей, чей company_id совпадает с местоположением company_id - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть много-много отношений между пользователями и местоположениями. Я хочу отфильтровать список выбора «присоединить пользователя», чтобы показывать только пользователей, чья company_id соответствует company_id местоположения, в котором я сейчас нахожусь. Я создал статическую функцию с именем relatableUsers, которая добавляет в запрос предложение «where».

public static function relatableUsers(NovaRequest $request, $query)
{
    return $query->where('company_id', ???);
}

Как вытащить текущее местоположение company_id в этот запрос? Если я жестко кодирую company_id, как показано ниже, фильтр работает, поэтому я знаю, что это возможно.

public static function relatableUsers(NovaRequest $request, $query)
{
    return $query->where('company_id', 'FA624E60-DD37-11E8-A540-C3C0A709EE15');
}  

Информация о записи не сохраняется в $request или $query.

РЕДАКТИРОВАТЬ - добавление отношений

Модель пользователя:

public function company()
{
    return $this->belongsTo(Company::class);
}

    public function locations()
{
    return $this->belongstoMany(Location::class);

}

Модель местоположения:

public function company()
{
    return $this->belongsTo(Company::class);
}

    public function users()
{

    return $this->belongstoMany(User::class);

}

Отношения модели компании:

public function users()
{

    return $this->hasMany(User::class);

}


public function location()
{

    return $this->hasMany(Location::class);

}

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете получить цель Location из запроса, как показано ниже.

public static function relatableUsers(NovaRequest $request, $query)
{
    $location = $request->findResourceOrFail(); // Retrieve the location instance
    return $query->where('company_id', $location->company_id);
}
0 голосов
/ 07 ноября 2018

Итак, ваши таблицы locations и users имеют поле company_id, и вы хотите получить список пользователей, которые имеют тот же company_id, что и местоположение, над которым вы работаете. Это можно сделать, отфильтровав существующий метод отношений:

<?php
class Location extends Model
{
    public function relatableUsers()
    {
        return $this->users()->where("company_id", $this->company_id)->get();
    }
}

Обратите внимание, что я звоню $this->users(), а не $this->users. Это возвращает экземпляр построителя запросов, который вы можете изменить перед обращением к базе данных, вместо того, чтобы извлекать всех пользователей и сортировать коллекцию на стороне PHP. Теперь вы можете вызвать это на экземпляре модели Location:

<?php
$loc = Location::find($id);
$users = $loc->relatableUsers();
...