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 records
与 geography
相关联。
$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 ;)
我的模型、控制器和数据库迁移已经开始工作,我能够检索显示数据。
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 records
与 geography
相关联。
$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 ;)