在数据透视表上查询

时间:2019-08-04 12:26:02

标签: laravel

我是Laravel的新手,我需要一些查询帮助。

我有3张桌子:

  • 电缆(属于许多功能)

  • 功能(属于许多电缆)

  • 带有枢轴额外字段 value

  • 的电缆功能(枢轴)

我为每个人创建了一个具有关系(并且一切正常...)

  • 工作台电缆的结构是(Id,Code)

  • 表功能的结构为(标识,名称)

  • 数据透视表Cable_Feature的结构为(cable_id,feature_id,值)

  

现在,我需要构建一个查询(使用Maatwebsite / Excel在Excel中导出)。我需要每条记录都有:

  • 电缆。代码

  • Feature.Name

我能够做到,但是我的问题是我需要将所有东西都放在一条线上 ... ES:假设我们有3条电缆和2个功能部件。在数据库中

电缆:

  • (id)1,(代码)0031TN

  • (id)2,(代码)0042GG

  • (id)3,(代码)0025ZS

功能:

  • (id)1,(名称)PVC

  • (id)2,(name)CM

  

Cable_Feature中的情况是:

  • 1-1-高质量

  • 1-2-12

  • 2-1-高质量

  • 2-2-6

  • 3-1低质量

  • 3-2 -11

现在我需要查询此结果(行为1)

  • 0031TN-高质量-12

  • 0042GG-高质量-6

  • 0025ZS-低质量-11

3 个答案:

答案 0 :(得分:0)

没有Laravel的查询是这样的:

SELECT code, 
       GROUP_CONCAT(`value`) 
FROM   cable_feature 
       JOIN cables 
         ON cables.id = cable_feature.cable_id 
GROUP  BY cables.code; 

您可以在此处使用Laravel Query Builder进行构建。

请记住,如果您的group_concat值大于限制,则需要在MySQL中设置alter group_concat_max_len变量。 例如:SET SESSION group_concat_max_len = 10000;

答案 1 :(得分:0)

您尚未共享模型代码。因此,我假设您的一个模型中具有这样的关系。我正在使用电缆模型

public function features()
{
    return $this->belongsToMany('App\Feature')
        ->withPivot('value');
}

现在在您的控制器中

public function getAll()
    {
        $cables = Cable::all();
        foreach ($cables as $cable)
            foreach ($cable->features $feature)
            {
                echo $cable->code; //this is from the cable table
                echo $feature->name; //this is from the feature table
                echo $feature->pivot->value; //this is coming from the pivot table

            }
        }
    }

您也可以在刀片中执行此操作。

答案 2 :(得分:0)

首先感谢您为我提供的帮助。

说明:我用意大利语写过(Cavi =电缆|功能= Caratteristiche)

我已经解决了一些代码,但是我认为这不是一个很好的超级优雅的解决方案(但是可以工作;))

Maatwebsite / Excel软件包使您能够构建$ data进行导出。我已经建立了所有东西:

$cavi = Cavo::with('famiglia', 'caratteristiche')->get();

        return $cavi->map(function($cavo) {
            foreach ($cavo->caratteristiche as $caratteristica) {
                if($caratteristica->id == 5 || $caratteristica->id == 7) {
                    $caratteristicheCavo[] = $caratteristica->pivot->valore;
                }
            }

            return $datiEplanArray = [
                'ParNumber' => "AGE" . $cavo->codice_articolo,
                'TypeNumber' => $cavo->famiglia->codice_articolo,
                'OrderNumber' => $cavo->codice_articolo,
                'Designation EN' => $cavo->famiglia->nome,
                'Description EN' => $cavo->famiglia->descrizione,
                'Document/Link 1' => '/ita/pdf/' . $cavo->famiglia->codice_articolo . '.pdf',
                'Description Doc. 1 EN' => '/en//pdf/' . $cavo->famiglia->codice_articolo . '.pdf',
                'ExternalDiameter / ND' => $caratteristicheCavo[1],
                'Connections / Number ' => $caratteristicheCavo[0],
                'Cable type' => $cavo->famiglia->nome,   
                'PreviewPicture' => '/immagini/' . $cavo->famiglia->immagine,
                'EDP catalogue structure level 1 EN' => 'Cavo',
            ];
        });