有此请求:
$apps = DB::select("select
a.id, a.app_name, a.country_id, a.feature_id, a.organization_id, a.status_id,
o.organization_name, f.feature_name
from apps as a
left join organizations as o on o.id = a.organization_id
left join features as f on f.id = a.feature_id
order by app_name
");
$apps = DB::table('apps')->orderBy('app_name')->paginate(10);
return response()->json($apps);
我得到了这个json:
{
"current_page": 1,
"data": [
{
"id": "ab221e40-e711-11e8-b124-95a6d9405f4b",
"app_name": "Asf autre",
"country_id": "FR",
"feature_id": "5724ecad-f8d3-3b5f-bd36-d62e97a26798",
"organization_id": "44720e79-eaf9-300a-bbcd-cdfce46dbf54",
"status_id": "PROD",
"created_by": "6d2aeca8-a29d-38b0-bbd7-8f0c9656ca3b",
"updated_by": null,
"created_at": "2018-11-13 07:59:30",
"updated_at": "2018-11-13 07:59:30"
},
{
"id": "f4ccb480-e711-11e8-a6e6-3b8112548306",
"app_name": "Asf pays",
.....
完美。
我想在“数据”键的每个元素中添加一些键。要拥有这种json:
{
"current_page": 1,
"data": [
{
"akeyhere" : "avaluehere",
"id": "ab221e40-e711-11e8-b124-95a6d9405f4b",
"app_name": "Asf autre",
"country_id": "FR",
"feature_id": "5724ecad-f8d3-3b5f-bd36-d62e97a26798",
"organization_id": "44720e79-eaf9-300a-bbcd-cdfce46dbf54",
"status_id": "PROD",
"created_by": "6d2aeca8-a29d-38b0-bbd7-8f0c9656ca3b",
"updated_by": null,
"created_at": "2018-11-13 07:59:30",
"updated_at": "2018-11-13 07:59:30"
},
{
"akeyhere" : "anothervalue",
"id": "f4ccb480-e711-11e8-a6e6-3b8112548306",
.....
您将如何做?我认为我必须使用“资源”概念,但我从未使用过,并且尝试没有成功。
非常感谢 Dom
答案 0 :(得分:1)
您当前正在使用查询生成器来构建查询,如果要“自动”添加应使用模型类的属性,则与查询生成器基本相同。
class SomeClass extends Model {
protected $appends = ['akeyhere'];
public function getakeyhereAttribute()
{
$data = //data from somewhere
return $data;
}
}
SomeClass::paginate(10); //will always include `akeyhere`
您还可以使用API Resource更好地处理api输出。
答案 1 :(得分:1)
如果将对象转换为json,则可以在模型中使用$append
变量,并使用如下访问器:
// Get your data using eloquent to retrieve models
$apps = App::orderBy('app_name')->paginate(10);
return response()->json($apps);
在模型上添加:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class App extends Model
{
protected $appends = ['akeyhere'];
public function getAkeyhereAttribute()
{
return 'avaluehere';
}
}
如果您要坚持使用原始查询或查询构建器,则还有两种选择:
〜迭代结果并附加所需的元素。
$paginator->getCollection()->map(function ($element) {
$element['akeyhere'] = 'avaluehere';
return $element;
})
〜水合结果集,然后将其转换为json
$apps = DB::table('apps')->orderBy('app_name')->paginate(10);
$apps = App::hydrate($apps);
return response()->json($apps);
这会将数组的结果集转换为模型,因此您现在可以利用append
功能。
IMO ,您最好利用Laravel提供的模型功能,因此,如果我是我,我会选择第一种选择。
希望这对您有所帮助。
答案 2 :(得分:0)
getCollection()
将返回您集合的数据部分。您可以使用Laravel
收集功能transform
来更新对象
$apps->getCollection()->transform(function($iterator){
return array_merge($iterator, [
// add your extra (key, value) here
]);
});
当您不想每次在收集项目中需要额外价值时都不想更新核心模型时,此方法适用。
但是
如果有必要,并且在此模型的各处都需要那些额外的属性,则应使用Custom Attribute
解决方案。
答案 3 :(得分:0)
https://laravel.com/docs/5.7/collections#method-each
$apps = DB::table('apps')->orderBy('app_name')->paginate(10);
$apps->each(function ($item) {
$item->some_key = 'some_value';
});
return response()->json($apps);