У меня есть много-много отношений между пользователями и местоположениями. Я хочу отфильтровать список выбора «присоединить пользователя», чтобы показывать только пользователей, чьи 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);
}
Вы можете получить цель Location
из запроса, как показано ниже.
public static function relatableUsers(NovaRequest $request, $query)
{
$location = $request->findResourceOrFail(); // Retrieve the location instance
return $query->where('company_id', $location->company_id);
}
Так что ваши 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();