You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模型间跨层级关联关系:如何查询特定国家下的所有人员?

嘿,这个多级关联查询的问题其实挺典型的,咱们就着你给出的People → City → Region → Country归属链,来聊聊怎么快速拿到特定国家下的所有人员~

方法1:用ORM框架实现(举两个常用框架的例子)

大部分现代开发都会用ORM来简化关联查询,不用自己写复杂的JOIN语句,下面是两个主流框架的实现方式:

Django ORM 示例

Django的ORM支持用双下划线__来跨关联表查询,非常直观:

# 先假设你的模型已经正确定义了ForeignKey关联
from your_app.models import Country, People

# 方式1:先拿到目标国家对象,再关联查询
target_country = Country.objects.get(name="China")
people_in_country = People.objects.filter(city__region__country=target_country)

# 方式2:直接通过国家名称过滤,更简洁
people_in_country = People.objects.filter(city__region__country__name="China")

这里的city__region__country就是沿着归属链一步步穿透,Django会自动帮你生成对应的JOIN语句,省心又不容易出错。

Laravel Eloquent 示例

Laravel的Eloquent同样支持跨关联查询,两种写法都可行:

// 方式1:用whereHas嵌套关联过滤
$people = App\Models\People::whereHas('city.region.country', function ($query) {
    $query->where('name', 'China');
})->get();

// 方式2:直接用点语法跨关联,更简洁
$people = App\Models\People::where('city.region.country.name', 'China')->get();

注意这里的city、region、country要和你模型里定义的关联方法名一致哦~

方法2:原生SQL查询

如果项目不用ORM,直接写原生SQL的话,核心就是通过JOIN把四张表关联起来,再过滤目标国家:

SELECT p.*
FROM People p
JOIN City c ON p.city_id = c.id
JOIN Region r ON c.region_id = r.id
JOIN Country co ON r.country_id = co.id
WHERE co.name = 'China';

这条SQL通过外键把人员、城市、地区、国家表连在一起,最后通过WHERE co.name = 'China'筛选出指定国家的所有人员。

小提示
  • 记得给所有关联外键(比如city_id、region_id)建立数据库索引,不然数据量大的时候查询速度会大打折扣。
  • 如果需要分页、排序,直接在ORM查询后面追加对应方法就行,比如Django的people_in_country.order_by('age').paginate(20),或者Laravel的$people->orderBy('age')->paginate(20)。

内容的提问来源于stack exchange,提问作者MrBelongsTo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:17