Laravel Eloquent - 使用 Eloquent 按地区对客户记录进行排序

Laravel Eloquent - Sort client records by region using Eloquent

我的模型、控制器和数据库迁移已经开始工作,我能够检索显示数据。

clients.blade.php

@foreach ($table_companies as $client)
    {{ $client['geography'] }} - {{ $client['company'] }} - {{ $client['country'] }} - {{$client['industry'] }}
@endforeach

ClientsController.php

public function showClients() {

    $table_companies = Clients::selectRaw(' name_company company, geography geography, country country, type_industry industry, emphasize bold')   
      ->groupBy('company', 'geography', 'country', 'industry', 'bold')
      ->get()
      ->toArray();

    return view('about.our-clients', compact('our-clients', 'table_companies'));

2017_12_12_173246_create_clients_table.php

Schema::create('table_companies', function (Blueprint $table) {
    // $table->increments('id');
    // $table->timestamps();
    $table->increments('ID_CLIENT');
    $table->string('NAME_COMPANY');
    $table->string('TYPE_INDUSTRY');
    $table->string('COUNTRY');
    $table->string('GEOGRAPHY');
    $table->integer('emphasize');
    $table->timestamps();
});

}

我想做的是格式化数据并按地理位置分组,传递 url 参数

示例 1:/our-clients.php?geography=North_America

并将它们分组为:

北美 美国

安泰 |湾景

加拿大 边境 |联邦法院

示例 2:/our-clients.php?geography=Europe 欧洲 比利时

挖掘 |索诺克

丹麦 斯堪的纳维亚 |国家警察

有什么想法吗?

您可以更改 groupBy 子句以使用请求参数:

...
->groupBy('company', request()->get('geography'), 'country', 'industry', 'bold')
->get()
->toArray()

获取所有记录后使用 groupBy() 将其作为 group of recordsgeography 相关联。

$table_companies = Clients::selectRaw(' name_company company, geography geography, country country, type_industry industry, emphasize bold')   
  ->get()
  ->groupBy('geography')
  ->toArray();

它读起来好像你想过滤地理?还是分组?但是如果是后者,那你为什么要有那个get参数呢?不太清楚。

所以如果你想过滤,你显然应该在你的查询中包含一个 where('geography' , request()->geography)。

您也可以获取所有内容,然后使用 filter() 方法进行过滤
https://laravel.com/docs/5.5/collections#method-filter

$filtered_table_companies = $table_companies->filter(function ($value, $key) {
    return $value->geography == request()->geography;
});

如果您在其他地方不需要其他地区,我会建议使用 Eloquent 版本。

如果你想按国家分组,我会建议
https://laravel.com/docs/5.5/collections#method-maptogroups

$grouped_table_companies = $table_companies->mapToGroups(function ($item, $key) {
    return [$item->geography] => $item;
});

在 tinker 中尝试一次以查看它的输出并尝试理解它。
然后,您可以在 blade 文件中使用 2 个嵌套的 foreach 遍历 collection,例如

@foreach($grouped_table_companies as $region => $regional_table_companies)
    <div>{{ $region }}</div>
    @foreach($regional_table_companies as $table_company)
        // output stuff here
    @endforeach
@endforeach

如果你想在早期使用 groupby 而不是过滤器,你显然可以在你的过程中执行 2 个 mapToGroups(),只需稍微玩一下 tinker ;)