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

Laravel7中如何关联查询三张表:获取客户关联的国家与州名称

嘿,我来帮你解决这个问题,这里有两种靠谱的方案,优先推荐用Eloquent模型关联,毕竟这是Laravel的核心优势之一,代码也更整洁好维护:

方法一:通过Eloquent模型关联实现

首先得在三个模型里定义好关联关系,这样后续查询就会非常方便:

  1. 完善CustomerContact模型
    给它加上和Country、State的关联方法,因为每个客户联系人都属于一个国家和一个州,所以用belongsTo关联:

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class CustomerContact extends Model
    {
        // 关联国家表,第二个参数是外键字段名(如果字段名符合Laravel规范可以省略)
        public function country()
        {
            return $this->belongsTo(Country::class, 'country_id');
        }
    
        // 关联州表
        public function state()
        {
            return $this->belongsTo(State::class, 'state_id');
        }
    }
    
  2. 查询带关联的数据
    用with()方法预加载关联数据,避免常见的N+1查询性能问题,然后就能拿到完整的客户信息了:

    $data = CustomerContact::latest()
        ->with(['country', 'state'])
        ->get();
    

    之后你可以这样访问关联字段:

    foreach ($data as $customer) {
        echo "客户名称:" . $customer->c_name;
        echo "国家:" . $customer->country->name;
        echo "州/省:" . $customer->state->name;
    }
    
方法二:直接用Query Builder关联查询

如果不想定义模型关联,也可以直接写查询构造器语句来关联三张表,适合快速获取数据的场景:

$data = \DB::table('customer_contacts')
    ->select(
        'customer_contacts.c_name as customer_name',
        'countries.name as country_name',
        'states.name as state_name'
    )
    ->join('countries', 'customer_contacts.country_id', '=', 'countries.id')
    ->join('states', 'customer_contacts.state_id', '=', 'states.id')
    ->orderBy('customer_contacts.id', 'desc') // 和latest()效果一致,按id倒序
    ->get();

这个查询返回的结果里,每条数据都会直接包含customer_name、country_name、state_name三个字段,直接用就行。

简单总结下:模型关联的方式更适合长期维护的项目,后续扩展功能也更灵活;直接查询的方式则适合快速实现需求的简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:07:32