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

如何基于attractions表parent_place_id查询places表记录及设置Laravel关联

解决方案:关联关系与查询实现

表结构与示例数据

places表

idplace_idname
1999New York
21000Miami
31001Houston

attractions表

idplace_idparent_place_id
11000999
21001999

关联关系说明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:58:18