Laravel 使用城市 id 按州获取用户

Posted

技术标签:

【中文标题】Laravel 使用城市 id 按州获取用户【英文标题】:Laravel get users by state using city id 【发布时间】:2021-06-30 14:55:05 【问题描述】:

我有users 表,其中有city_idcities 表中的每个城市都有state_id。如何让任何州的用户使用city_id

这是我的代码:

$users = User::role('company')
            ->when((int) $state, function ($query, $state) 
                // here query
            )
            ->when((int) $city, function ($query, $city) 
                return $query->where('city_id', $city);
            )
            ->get();

我试过了:

$users = User::role('company')
            ->when((int) $state, function ($query, $state) 
                $cities = City::where('state_id', $state)
                            ->pluck('id')
                            ->toArray();
                return $query->whereIn('city_id', $cities);
            )
            ->when((int) $city, function ($query, $city) 
                return $query->where('city_id', $city);
            )
            ->get();

这是可行的,但是如何在不使用City 模型进行新查询的情况下正确执行此查询?

【问题讨论】:

【参考方案1】:

你建立了用户和城市之间的关系吗?它应该是这样的:

 public function city()
    
        return $this->belongsTo(City::class, 'city_id');
    

您可以使用该关系让用户where has 属于该州的城市:

$users = User::role('company')
            ->when((int) $state, function ($query)use ($state) 
                return $query->whereHas('city',function ($query)use ($state)
                    $query->where('state_id',$state);
                );
            )
            ->when((int) $city, function ($query)use($city) 
                return $query->where('city_id', $city);
            )
            ->get();

【讨论】:

嗨@Andreas Hunter,感谢您的编辑,不管有没有返回,内联函数都可以正常工作,但是像您的编辑一样使用返回更清晰。【参考方案2】:

你可以使用 Laravel HasManyThough

假设你有一个州,每个州有很多城市,每个城市有很多用户

那么在状态模型中,可以添加这个函数

public function users()

    return $this->hasManyThrough(User::class, City::class);

这个函数将返回给定状态的所有用户

示例:

$state = State::first();
$users = $state->users;

更多信息请阅读docs

【讨论】:

以上是关于Laravel 使用城市 id 按州获取用户的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中构建查询表达式时需要帮助

laravel 8:插入方法在 eloquent 中获取最后一个插入 id(插入方法)

SQL 按 Top 3 和其他对行进行分组。 (按州和其他排名前 3 名的城市的收入)

如何使用Laravel Eloquent获取相关城市的国家名称

从 eloquent builder laravel 7 获取关系数据

Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本