使用 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?为什么不只是nameproduct_price,所以你至少是一致的?

【讨论】:

你是对的。其实我应该给一些有意义的列名

以上是关于使用 eloquent laravel 获取连接表数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:如何从连接表中仅获取某些列

在 Laravel Eloquent 中连接表值

Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本

Laravel - Eloquent:使用用户发布表从用户那里获取帖子

使用 Laravel 的查询构建器或 Eloquent 将一个表与一个临时表进行内部连接

如何在laravel eloquent中为左连接表起别名