如何在 laravel 中使用 joins 和 groupby 并进行迭代?

How to use joins and groupby in laravel and to iterate through?

我有一个商店 table 和一个部分 table。该商店可能位于许多部分下。 问题是,如果商店属于多个部分,我无法查看所有部分。 数据库如下:

购物table

id  |  shopname

1   | KazaBlanka
2   | Adiddas
3   | Kentaky

栏目Table

id  |  Sectionname

1   | Clothes
2   | Shoes
3   | Foods

ShopSection(link)table

id  |  sectionId   |    ShopId

1   | 1            |    1
2   | 1            |    2
3   | 2            |    1
4   | 2            |    2
5   | 3            |    3

在我的控制器中,我尝试使用这样的查询来检索数据:

$data = Shops::join('shopsection','shopsection.shopid','=','shop.id')
    ->join('sections','sections.id','=','shopsection.sectionid')        
    ->select('shop.id as id', 'sectionname as sectionname', 
    'shopname as shopname')  
    ->groupBy('shop.id')      
    ->paginate(15);

在我看来,我显示的数据如下

@foreach($data as $row)
    <tr>
        <td>{{ $row->shopname }}</td>
        <td>{{ $row->shopsection }}</td>
    </tr>
@endforeach

如果商店属于多个部分,这只会显示第一部分。 我怎样才能循环将结果数据再次扔到(每个商店)以显示里面的部分?我需要使用 groupBy 吗??

提前致谢。

首先,你为什么不使用模型关系?这是 Laravel 中的一项强大功能:阅读 here 如何正确定义此类关系。

当你的关系被定义时,你的查询代码将被简化为:

$data = Shops::with('sections')->paginate(15);

当您指定关系名称 sections 时,Laravel 进行正确的连接,并且在结果数据中,您将有一个键 sections 将包含节的集合,因此您可以遍历它们。

感谢@Vit Kos。

现在我更新了我的商店模型以拥有这个:

public function sections()
{
    return $this->belongsToMany('Sections');
}

然后在控制器中我以这种简单的方式检索数据:

$data = Shops::->with('sections')
                ->orderBy('sortby')
                ->paginate(15);

并且在视图中我可以访问这样的部分:

@foreach($data as $row)
    <td>{{ $row->shop_name }}</td>
    <td> 
    @foreach ($row->sections as $section)
        {{ $section->section_name}} 
    @endforeach
    </td>
@endforeach