由几个不同的专栏组成的一个雄辩组的联盟

时间:2016-06-07 14:13:02

标签: php laravel eloquent

我从一个表中查询解析。该表有很多列,我只显示重要的列

table oc_za_puni_uredjaj
sif_company  (integer - primary, value for company)
sif_device   (integer - primary, value for device)
sif_nos      (integer - primary, value for customer)
sif_mp       (integer - primary, value for customer's place)
rbr          (integer - primary, value for customer's place item)
ocitano      (integer - 0 - empty, 1 - full)
datum        (date    - date of the record)
area         (text    - name of area of customer)
....

我现有的查询是

$data = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
            ->where('sif_company',$request->sif_company)
            ->groupBy('area')->get();

如果我获得每个客户/客户的位置以及他的项目仅适用于一个设备(这就像我在整个表中只有1 sif_device那么,这给了我正确的数据。

例如

sif_company | sif_device | sifnos | sif_mp | rbr | ocitano | datum | area |
---------------------------------------------------------------------------
1           |     1      | 1      | 1      | 1   | 1       |...    |abcd
1           |     1      | 1      | 2      | 1   | 0       |...    |abcd
1           |     1      | 2      | 1      | 1   | 1       |...    |abc
1           |     1      | 1      | 2      | 1   | 1       |...    |abcd
1           |     1      | 1      | 2      | 3   | 1       |...    |abcd

输出数据就像(只适用于1个设备)

naselje    |  total    |    ocitano
------------------------------------
abc        |  1        |     1
abcd       |  4        |     3 

问题是我是否有2个不同设备的相同数据。我可以在下表中找到数据

sif_company | sif_device | sifnos | sif_mp | rbr | ocitano | datum | area |
---------------------------------------------------------------------------
1           |     1      | 1      | 1      | 1   | 1       |...    |abcd
1           |     2      | 1      | 1      | 1   | 0       |...    |abcd
1           |     1      | 2      | 1      | 1   | 1       |...    |abcd
1           |     2      | 2      | 1      | 1   | 1       |...    |abcd
1           |     1      | 3      | 1      | 1   | 1       |...    |abc

我想要的数据输出应该是

naselje    |  total    |    ocitano
------------------------------------
abc        |  1        |     1
abcd       |  2        |     2 

因此,如果我在(sif_nossif_mprbr)的表格行中有不同的设备(sif_device),那么我有案例:

  • 如果只有其中一个ocitano = 1那么对于那个区域我必须将输出中的ocitano 增加1并使用ocitano值= 1行(以后的工作)
  • 如果有多行ocitano = 1,那么我必须将输出中的ocitano增加1并获取最新日期的行(列datum)以供日后工作< / LI>
  • 如果所有人都ocitano = 0,那么我不会在输出中增加ocitano

任何帮助都会很好

修改

到目前为止,我已成功获取数据数据,我希望从问题的开始运行我的查询。功能是

 public function testFunction(Request $request){
    $sif_tvrtka = $request->sif_tvrtka;
    $podaci = za_prazni_uredjaj::where('sif_company',$sif_tvrtka)->get();
    $indeks = 0;
    $izlaz = new Collection();
    //tried with array also
    //$izlaz = [];
    foreach ($podaci as $podatak){
        $exists = false;
        foreach ($izlaz as $izl){
            if($izl->sifnos == $podatak->sifnos && $izl->sifkup == $podatak->sifkup && $izl->redbrprik == $podatak->redbrprik){
                $exists = true;
                break;
            }
        }
        if ($exists == true){
            foreach ($izlaz as &$izl){
                if($izl->sifnos == $podatak->sifnos && $izl->sifkup == $podatak->sifkup && $izl->redbrprik == $podatak->redbrprik) {
                    if ($izl->ocitano < $podatak->ocitano) {
                        $izl = $podatak;
                    } else {
                        if ($izl->datumNovogOcitanja < $podatak->datumNovogOcitanja)
                        {
                            $izl = $podatak;
                        }
                    }
                }
            }
        }
        else{
            $izlaz[$indeks++] = $podatak;
        }

    }
    dd($izlaz);
}

但我有一个小问题。我在$izlaz中的数据不是集合,因此我无法使用查询构建器进行查询

$data = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
            ->where('sif_company',$request->sif_company)
            ->groupBy('area')->get();

有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

看到这个编辑,你必须对其进行调整,但要明白这一点。

这会产生预期的结果吗?

//one of them has ocitano = 1
$data1 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
            ->where('sif_company',$request->sif_company)
            ->having('sum(ocitano)', 1)
            ->groupBy('area');
    // several rows with ocitano = 1
        $data2 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano, sum(ocitano) ocitano_max, max(datum) datum'))
                    ->where('sif_company',$request->sif_company)
                    ->having('ocitano_max', '>', 1)
                    ->groupBy('area');
//ocitano = 0
        $data0 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, max(ocitano) ocitano, max(datum) datum'))
                    ->where('sif_company',$request->sif_company)
                    ->where('ocitano', 0)
                    ->groupBy('area', 'sif_device');
$data = $data1->unionAll($data0)->unionAll($data2);
$data = $data->get();