如何基于attractions表parent_place_id查询places表记录及设置Laravel关联
解决方案:关联关系与查询实现
表结构与示例数据
places表
| id | place_id | name |
|---|---|---|
| 1 | 999 | New York |
| 2 | 1000 | Miami |
| 3 | 1001 | Houston |
attractions表
| id | place_id | parent_place_id |
|---|---|---|
| 1 | 1000 | 999 |
| 2 | 1001 | 999 |
关联关系说明
Has Many Through 不适用当前场景——它是为三张表的间接层级关联设计的(例如 Place -> Attraction -> SubPlace 这类三层结构)。当前仅涉及两张表,核心关联逻辑是:
- attractions表的
place_id与 places表的place_id为多对一关联(一条attraction记录对应一个place) - 我们需要筛选出attractions表中
parent_place_id = 999的记录,再关联到对应的places记录
原生SQL查询语句
通过内连接即可直接获取目标数据:
SELECT p.* FROM places p INNER JOIN attractions a ON p.place_id = a.place_id WHERE a.parent_place_id = 999;
执行结果会返回Miami、Houston两条符合条件的记录。
Laravel 实现方式
1. 模型关联定义
在 Attraction 模型中定义与 Place 的关联:
// app/Models/Attraction.php public function place() { // 第二个参数是attractions表的外键,第三个参数是places表的关联字段 return $this->belongsTo(Place::class, 'place_id', 'place_id'); }
若需从父级Place直接获取子级Place(自关联场景):
可以用 Has Many Through 实现跨同一张表的间接关联(此时逻辑上是 ParentPlace -> Attraction -> ChildPlace,满足三层关联的要求):
// app/Models/Place.php public function childPlaces() { return $this->hasManyThrough( Place::class, // 最终要关联的模型 Attraction::class, // 中间关联模型 'parent_place_id', // 中间表(attractions)关联父级Place的字段 'place_id', // 目标模型(places)被关联的字段 'place_id', // 当前模型(父级Place)关联中间表的字段 'place_id' // 中间表关联目标模型的字段 ); }
2. 数据查询
方式一:通过关联查询
// 获取parent_place_id=999对应的所有Place记录 $childPlaces = Attraction::where('parent_place_id', 999) ->with('place') ->get() ->pluck('place');
方式二:直接用查询构造器连表
$childPlaces = Place::join('attractions', 'places.place_id', '=', 'attractions.place_id') ->where('attractions.parent_place_id', 999) ->select('places.*') ->get();
方式三:通过父级Place模型的关联获取
// 获取place_id=999的父级Place的所有子级Place $parentPlace = Place::where('place_id', 999)->first(); $childPlaces = $parentPlace->childPlaces;
内容的提问来源于stack exchange,提问作者user2343632
相关产品推荐
相关产品推荐

