【问题标题】:Nova Relatable Filtering - how to filter users whose company_id matches locations company_idNova Relatable Filtering - 如何过滤 company_id 与位置 company_id 匹配的用户
【发布时间】:2019-04-10 08:30:09
【问题描述】:

我在用户和位置之间有多对多的关系。我想过滤我的“附加用户”选择列表以仅显示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 将公司关系添加到用户和位置

标签: php laravel laravel-nova


【解决方案1】:

您可以从如下请求中检索目标Location

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

【讨论】:

    【解决方案2】:

    所以您的locationsusers 表都有一个company_id 字段,并且您想要提取与您正在处理的位置具有相同company_id 的用户列表。这可以通过过滤现有的关系方法来完成:

    <?php
    class Location extends Model
    {
        public function relatableUsers()
        {
            return $this->users()->where("company_id", $this->company_id)->get();
        }
    }
    

    请注意,我调用的是 $this-&gt;users() 而不是 $this-&gt;users。这将返回一个查询构建器实例,您可以在与数据库对话之前对其进行更改,而不是拉取所有用户并在 PHP 端对集合进行排序。现在您可以在 Location 模型的实例上调用它:

    <?php
    $loc = Location::find($id);
    $users = $loc->relatableUsers();
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多