У меня много отношений между пользователями и местоположениями. Я хочу отфильтровать свой список выбора «прикрепить пользователя», чтобы отображались только те пользователи, чей company_id совпадает с company_id того места, где я сейчас нахожусь. Я создал статическую функцию relatableUsers, которая добавляет в запрос предложение «where».
public static function relatableUsers(NovaRequest $request, $query)
{
return $query->where('company_id', ???);
}
Как мне вставить company_id текущего местоположения в этот запрос where? Если я жестко кодирую 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);
}
Если вы добавите детали отношений, возможно, кто-то может оказать вам некоторую помощь в виде отношений hasManyThrough.
@ miken32 Я добавил отношения, спасибо
А как насчет модели Company? Как это соотносится с обеими этими моделями?
@ miken32 добавил отношения компании к пользователям и местоположениям






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