首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在一个视图中从两个表中获取多列数据

如何在一个视图中从两个表中获取多列数据
EN

Stack Overflow用户
提问于 2019-06-20 06:09:20
回答 2查看 91关注 0票数 0

我尝试从由外键(brand_id)连接的两个表(brands和raw_materials)中获取数据。一个品牌可以有多种原材料。我希望它在一个页面上显示在其各自的品牌下。取而代之的是,我会单独显示结果。

使用Laravel 5.7和Eloquent。

代码语言:javascript
复制
My Tables
[brands]
id    name
----------
1   Apple 
2   Colgate
3   LintX

[raw_materials]
id    name        brand_id      quantity
-----------------------------------------
1    50g pouch        1        200
2    10g laminate     3        320
3    75mm oil         1        500
4    Mint Rubber      3        400
5    Fire pouch       2        550
6    400 String       1        500
7    90g pouch        2        200

PageController

代码语言:javascript
复制
$brandData = DB::table('brands')
            ->join('raw_materials','raw_materials.brand_id','brands.id')
            ->select('brands.id as brand_id','brands.name as brand_name','raw_materials.name as raw_material','raw_materials.quantity')
            ->orderBy('brands.id')
            ->get();<br>
return view('rawmaterials.index', [
            'brandData'=>$brandData,
        ]);

视图

代码语言:javascript
复制
@foreach ($brandData as $brand)
<p>Brand Name: {{$brand->brand_name}}</p>
<p>{{$brand->raw_material}} | Quantity: {{$brand->quantity}}</p>
<br>
@endforeach

预期结果:

品牌名称:苹果

50g邮袋|数量: 200

75毫米机油|数量: 500

400 String |数量: 500

品牌名称:高露洁

火袋|数量: 550

75毫米机油|数量: 500

400 String |数量: 500

next brand ..

实际结果:

品牌名称:苹果

50g邮袋|数量: 200

品牌名称:苹果

75毫米机油|数量: 500

品牌名称:苹果

400 String |数量: 500

品牌名称:高露洁

火袋|数量: 550

And so on..

EN

回答 2

Stack Overflow用户

发布于 2019-06-20 08:10:08

这将会起作用

代码语言:javascript
复制
$brandData = \DB::table('brands')->orderBy("brands.id")->get();

foreach ($brandData as $brand) {
    $brand->raw_materials = \DB::table("raw_materials")->where("brand_id", $brand->id)->get();
}

return view('rawmaterials.index', [
            'brandData'=>$brandData
        ]);

然后在您的视图中,您将像这样使用嵌套...

代码语言:javascript
复制
@foreach ($brandData as $brand)
<p>Brand Name: {{$brand->name}}</p>
@foreach($brand->raw_materials as $raw)
<p>{{$raw->name}} | Quantity: {{$raw->quantity}}</p>
@endforeach
<br>
@endforeach

这应该可以完成工作。

另一方面,如果您想使用Eloquent,则必须按如下方式设置品牌模型和RawMaterial模型中的关系,假设品牌和RawMaterial模型直接位于应用程序文件夹中

代码语言:javascript
复制
class Brand extends Model
{
    public function raw_materials()
    {
        return $this->hasMany('App\RawMaterial');
    }
}

class RawMaterial extends Model
{
    public function brand()
    {
        return $this->belongsTo('App\Brand');
    }
}

然后在您的控制器中,您只需执行以下操作...

代码语言:javascript
复制
$brandData = \App\Brand::with("raw_materials")->orderBy("id")->get();

不需要更改.blade文件中的刀片语法,因为应用了相同的foreach循环

票数 1
EN

Stack Overflow用户

发布于 2019-06-20 08:26:16

您可以先创建一个关系:

代码语言:javascript
复制
function raw_materials() {
     return $this->hasMany(RawMaterial.class);
}

在控制器中,使用with()函数,如下所示:

代码语言:javascript
复制
$brandData = Brand::with('raw_materials')->all();
return view('rawmaterials.index', [
    'brandData'=>$brandData
]);

然后在您的视图中,您可以获得raw_materials表数据:

代码语言:javascript
复制
@foreach($branData as $brand)
   <h3>{{ $brand->name }}</h3>
   @foreach($brand->raw_materials as $raw_material)
       <div>{{ $raw_material->name }}</div>
       <div>{{ $raw_material->quantity }}</div>
   @endforeach
@endforeach
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56676530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档