Laravel7中如何关联查询三张表:获取客户关联的国家与州名称
嘿,我来帮你解决这个问题,这里有两种靠谱的方案,优先推荐用Eloquent模型关联,毕竟这是Laravel的核心优势之一,代码也更整洁好维护:
方法一:通过Eloquent模型关联实现
首先得在三个模型里定义好关联关系,这样后续查询就会非常方便:
完善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'); } }查询带关联的数据
用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
相关产品推荐
相关产品推荐

