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

Laravel Eloquent关联两张表:获取指定ORDER_ID的完整详情

解决Laravel Eloquent关联查询问题

需求梳理

基于指定的ORDER_ID(如X1、X4)关联ORDER_DETAILS和FORM_DETAIL两张表,返回FORM_DETAIL的所有记录:

  • 若ORDER_DETAILS中存在匹配FORM_ID、DETAIL_ID且ORDER_ID在指定列表的记录,显示对应VALUE
  • 无匹配时VALUE显示null
  • FORM_DETAIL的FORM_ID必须与指定ORDER_ID对应的FORM_ID一致

实现步骤与代码

1. 模型定义(确保表名映射正确)

如果表名不符合Laravel默认命名规则,需手动指定:

// app/Models/OrderDetail.php
class OrderDetail extends Model
{
    protected $table = 'ORDER_DETAILS';
    public $timestamps = false; // 表无created_at/updated_at字段时添加
}

// app/Models/FormDetail.php
class FormDetail extends Model
{
    protected $table = 'FORM_DETAIL';
    public $timestamps = false;
}

2. Eloquent查询实现

通过左连接保证FORM_DETAIL所有记录被返回,同时关联ORDER_DETAILS获取匹配的VALUE:

$targetOrderIds = ['X1', 'X4'];

// 第一步:获取指定订单对应的所有FORM_ID
$relatedFormIds = OrderDetail::whereIn('ORDER_ID', $targetOrderIds)
    ->pluck('FORM_ID')
    ->unique();

// 第二步:查询FORM_DETAIL并左连接ORDER_DETAILS
$result = FormDetail::select('FORM_DETAIL.*', 'ORDER_DETAILS.VALUE')
    // 限制FORM_DETAIL仅包含目标订单关联的表单ID
    ->whereIn('FORM_DETAIL.FORM_ID', $relatedFormIds)
    // 左连接匹配条件:FORM_ID、DETAIL_ID一致,且ORDER_ID在指定列表
    ->leftJoin('ORDER_DETAILS', function ($join) use ($targetOrderIds) {
        $join->on('FORM_DETAIL.FORM_ID', '=', 'ORDER_DETAILS.FORM_ID')
             ->on('FORM_DETAIL.DETAIL_ID', '=', 'ORDER_DETAILS.DETAIL_ID')
             ->whereIn('ORDER_DETAILS.ORDER_ID', $targetOrderIds);
    })
    ->get();

关键说明

  • 左连接(leftJoin)确保即使ORDER_DETAILS无匹配记录,FORM_DETAIL的记录依然返回,此时VALUE为null
  • unique()用于避免重复的FORM_ID,减少不必要的查询范围
  • 若需按单个订单查询,只需将$targetOrderIds改为单个值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:35:26