Laravel - 在 Eloquent 模型中返回自定义额外数据
Posted
技术标签:
【中文标题】Laravel - 在 Eloquent 模型中返回自定义额外数据【英文标题】:Laravel - Return Custom Extra Data in Eloquent Model 【发布时间】:2016-11-06 18:45:18 【问题描述】:我有一个这样的广告Eloquent Model-
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Advertisement extends Model
protected $dates = ['deleted_at'];
protected $table = 'advertisements'; //Table Name
protected $fillable = [
'user_id',
'category_id',
'sub_category_id',
'title',
'price',
'description',
'address',
'location_lat',
'location_lon',
'is_active',
'deleted_at'
];
protected $hidden = [
'user_id',
'category_id',
'sub_category_id',
'deleted_at',
'created_at',
'updated_at',
'is_active',
];
public function User()
return $this->belongsTo('App\User','user_id', 'id');
public function UserAdvertisementView()
return $this->hasMany('App\UserAdvertisementView', 'add_id', 'id');
所以它与UserAdvertisementView
Eloquent Model 相关联。所以,UserAdvertisementView
是这样的-
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserAdvertisementView extends Model
protected $primaryKey = null;
public $incrementing = false;
public $timestamps = false;
protected $table = 'user_add_views'; //Table Name
protected $fillable = [
'user_id',
'add_id',
'total_view'
];
所以,当我在控制器中使用它时-
return Advertisement::with('UserAdvertisementView')->get();
得到这样的东西-
[
id: 1,
title: "as dasd as",
price: 0,
description: "asd asdasdasd",
address: "Khagrachhari, Chittagong Division, Bangladesh",
location_lat: 23.13,
location_lon: 91.95,
user_advertisement_view: [
user_id: 1,
add_id: 1,
total_view: 1
,
user_id: 16,
add_id: 1,
total_view: 2
]
]
但我喜欢这样的东西-
[
id: 1,
title: "as dasd as",
price: 0,
description: "asd asdasdasd",
address: "Khagrachhari, Chittagong Division, Bangladesh",
location_lat: 23.13,
location_lon: 91.95,
user_advertisement_view: [
total_view: 3
]
]
所以,我想为所有用户获取total_count
(2+1 = 3)
的SUM。
所以,我需要在Eloquent Model 中创建一个自定义查询。
有什么办法吗?
更新-
根据@Jeff,我已经将这个添加到Advertisement
-
public $appends = ['total_views'];
public function getTotalViewsAttribute()
return $this->UserAdvertisementView->sum('total_view');
然后在控制器中进行这样的查询-
return Advertisement::get();
还有这个-
所以,当我处理大数据时,我有一些额外的数据不利于获得更好的性能。
那么,有没有什么办法可以去掉多余的部分,得到我们需要的东西。
或者有什么方法可以在 Eloquent 模型中的 with
clouse 中进行自定义查询?
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:在您的广告模型上,您可以添加:
public $appends = ['total_views'];
public function getTotalViewsAttribute()
return $this->UserAdvertisementView->sum('total_view');
当total_views
属性发送到 JSON 时,这将自动将 Advertisement
属性附加到您的模型。
【讨论】:
嗨@Jeff,感谢您的帮助,但我无法使用它。您能否在答案中添加更多详细信息,以便我需要更改位置和位置? (Model 有什么变化,controller 中怎么调用) 您只需将这些添加到您的Advertisement
模型中。您根本不需要更改控制器。控制器返回的 JSON 将自动多出一行 total_views: 3
但是有一个小问题,我正在像这样查询-return Advertisement::get();
并得到这样的结果-joxi.net/4AkogQBIMq7WjA.png 但我不喜欢额外的部分来节省带宽和提高性能
那么,有什么办法可以去掉那部分吗?
@AbrarJahin 当您使用UserAdvertisementView
属性时,它会加载相关对象的Collection
。然后你在那个Collection
上调用sum()
。但是,如果您使用关系方法,它将在数据库上运行 sum()
查询,而不是填充 Collection
并在其上运行 sum。所以:return $this->UserAdvertisementView()->sum('total_view');
(注意UserAdvertisementView()
方法,而不是UserAdvertisementView
属性)。以上是关于Laravel - 在 Eloquent 模型中返回自定义额外数据的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 在 Eloquent 模型中返回自定义额外数据
Laravel/Eloquent 建议覆盖 trait 属性?