【问题标题】:fetch join table data using eloquent laravel使用 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关系的方式,可以吗??

【问题讨论】:

    标签: php mysql laravel 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,所以你至少是一致的?

    【讨论】:

    • 你是对的。其实我应该给一些有意义的列名
    猜你喜欢
    • 2013-05-17
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多