使用 eloquent laravel 获取连接表数据
Posted
技术标签:
【中文标题】使用 eloquent laravel 获取连接表数据【英文标题】:fetch join table data using eloquent laravel 【发布时间】:2020-11-06 23:19:27 【问题描述】:我是 laravel 新手,想实现 eloquent 关系。
让我解释一下。
假设我有 2 张桌子
产品
product_id
product_name
brand_id
price
品牌
id
brand_name
每个产品都有一个品牌 ID。但在 Brands 表中,没有产品 ID。一个brand_id可以在多个产品行中,一个产品只有一个brand_id。我想在我写的产品模型中使用 Model.SO 从产品表加上品牌名称中选择一些关于产品表的品牌 ID 的列:
public function brands()
return $this->hasOne('App\Brand','product_id');
我在品牌模型中写道:
public function products()
return $this->belongsTo('App\Product','brand_id');
现在我想要结果:
product_name
price
brand_name
如何使用 eloquent 关系在控制器中获取这些数据?还有,我写Model关系的方式,可以吗??
【问题讨论】:
【参考方案1】:您的产品型号关系将在下方
public function brand()
return $this->belongsTo('App\Brand','brand_id');
public function product()
return $this->belongsTo('App\Product','product_id');
现在在控制器中,您可以添加如下查询。
$products = Product::with('brand','product')->get();
echo '<pre>'
print_r($products->toArray());
exit;
【讨论】:
谢谢,它工作正常。我有一个问题,可以将brand() 和product() 函数都放在Product Model 中吗?你能解释一下背后的原因吗? 是的,绝对没问题。现在,您在同一张表中有 2 个外键。将来一张表有很多关系。例如,在用户模型中有很多关系,比如用户可以创建产品、用户角色、用户帖子等。如果您的表与多个外键相关,那么您可以在模型中定义它。【参考方案2】:在我看来,您需要one-to-many
关系,因此一个品牌可以拥有许多产品,而许多产品属于一个品牌。
产品型号:
public function brand()
return $this->belongsTo('App\Brand');
品牌型号:
public function products()
return $this->hasMany('App\Product');
那么你就可以得到这样的品牌信息:
完整的品牌模型:
Product::first()->brand
品牌名称:
Product::first()->brand->brand_name
来自docs:
一对多关系用于定义一个关系 单个模型拥有任意数量的其他模型。例如,一篇博文 可能有无数个 cmets。
附注:
你的表格列名对我来说没有多大意义,为什么你在产品上有product_id
,而在品牌上却只是叫id
?为什么你有product_name
而只有price
?为什么不只是name
或product_price
,所以你至少是一致的?
【讨论】:
你是对的。其实我应该给一些有意义的列名以上是关于使用 eloquent laravel 获取连接表数据的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent:如何从连接表中仅获取某些列
Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本
Laravel - Eloquent:使用用户发布表从用户那里获取帖子