如何在laravel中使用join和groupby并迭代?

时间:2015-01-20 08:43:57

标签: php mysql laravel laravel-4 eloquent

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

购物台

id  |  shopname

1   | KazaBlanka
2   | Adiddas
3   | Kentaky

章节表

id  |  Sectionname

1   | Clothes
2   | Shoes
3   | Foods

ShopSection(链接)表

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 ??

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

当您指定关系名称部分时,Laravel会进行正确的连接,并且在结果数据中,您将拥有一个包含部分集合的部分键,所以你可以循环使用它们。

答案 1 :(得分:0)

感谢@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