laravel - 如何在多对一 Eloquent 关系中检索具有另一个名称的列
问题描述
我刚刚在 Laravel 开始了一个新项目。我希望它是多语言的,所以有些表对每种语言都有一个字段,例如:
Continent
id
en (for English)
pt (for Portuguese)
es (for Spanish)
以便:
1 'America', 'América', 'America'
2 'Africa', 'África', 'África'
同样,我有一个“区域”表。
我的大陆模型已经有:
public function regions() {
return $this->hasMany(Region::class);
}
我的目标是在运行时重命名列,以便我可以使用“Continent->name”或“Region->name”,而不是“Continent->en”和“Region->en”。
到目前为止,我可以通过这种方式取得成果:
大陆控制器@index
public function index() {
$lang = 'en';
$continents = DB::table('continents')->rightJoin('regions', 'continent_id', '=', 'continents.id')->select("continents.$lang AS continent_name", "regions.$lang AS region_name")->get();
return view('geo.continents.index', compact('continents'));
}
但是,这给我带来了一张桌子:
@section('content')
@foreach ($continents as $continent)
{{ $continent->region_name }} {{ $continent->continent_name }}
@endforeach
@endsection
Central America (America)
Caribbean (America)
North America (America)
South America (America)
我想完成类似的结果,但使用 Eloquent 风格。像这样的东西:
$continents = Continent::select('continents.en AS name')->with('regions')->get();
到目前为止,我可以将大陆名称作为“名称”属性。如何将区域名称作为“名称”属性获取,例如:
$大陆->名称;$区域->名称;
解决方案
您想查看范围。
// Continent.php
public function scopeRegion($query, $region)
{
return $query->where('region', $region);
}
然后在你的控制器中,
Continent::region('en')->get();
推荐阅读
- node.js - 续集循环依赖?
- rest - WCF Rest Service Sharepoint 托管提供 401 未经授权
- java - 在 Spring Boot 中允许空字符串变成空日期
- flutter - 将字节数据转换为pdf图像
- python - 基于 2 个数据帧的列生成
- primefaces - Primefaces文件上传多次问题
- javascript - 如何过滤数组中的字符串?
- azure-sql-database - 如何配置我的数据库以便可以从任何机器连接?
- python - Python - 重构代码以从全局变量中删除列表
- python - Scikit-Learn 的 .fit() 方法如何将数据传递给 .predict()?