如何在 laravel 中使用联接和分组以及循环访问


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

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

餐桌

id  |  shopname
1   | KazaBlanka
2   | Adiddas
3   | Kentaky

部分表

id  |  Sectionname
1   | Clothes
2   | Shoes
3   | Foods

商店部分(链接)表

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 中一个强大的功能:阅读此处如何正确定义这种类型的关系。

定义关系时,查询代码将简化为:

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

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

谢谢@Vit科斯。

现在我更新了我的商店模型,如下所示:

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