Nova Relatable Filtering — как фильтровать пользователей, чей company_id совпадает с местоположением company_id

У меня есть много-много отношений между пользователями и местоположениями. Я хочу отфильтровать список выбора «присоединить пользователя», чтобы показывать только пользователей, чьи 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

Решение

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

public static function relatableUsers(NovaRequest $request, $query)
{
$location = $request->findResourceOrFail(); // Retrieve the location instance
return $query->where('company_id', $location->company_id);
}
1

Другие решения

Так что ваши 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();
0

По вопросам рекламы [email protected]