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 текущего местоположения в этот запрос 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);

}

Статическая функция не может знать «текущий» объект. Почему бы вам не добавить в функцию еще один параметр?

miken32 06.11.2018 23:43

Если вы добавите детали отношений, возможно, кто-то может оказать вам некоторую помощь в виде отношений hasManyThrough.

miken32 06.11.2018 23:45

@ miken32 Я добавил отношения, спасибо

C. Gill 07.11.2018 14:34

А как насчет модели Company? Как это соотносится с обеими этими моделями?

miken32 07.11.2018 15:48

@ miken32 добавил отношения компании к пользователям и местоположениям

C. Gill 07.11.2018 16:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
5
3 651
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, в ваших таблицах 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);
}

Другие вопросы по теме