Nova 相关过滤 - 如何过滤 company_id 匹配位置 company_id 的用户

Nova Relatable Filtering - how to filter users whose company_id matches locations company_id

我在用户和位置之间建立了多对多关系。我想过滤我的 "attach user" select 列表,只显示 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);

}

所以你的 locationsusers 表都有一个 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。这个 return 一个查询生成器实例,您可以在与数据库对话之前更改它,而不是拉动所有用户并在 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);
}