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-&gt;UserAdvertisementView()-&gt;sum('total_view');(注意UserAdvertisementView() 方法,而不是UserAdvertisementView 属性)。

以上是关于Laravel - 在 Eloquent 模型中返回自定义额外数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中返​​回多对多关系的统一 JSON

Laravel - 在 Eloquent 模型中返回自定义额外数据

Laravel/Eloquent 建议覆盖 trait 属性?

Laravel 5 - 使用 Mockery 模拟 Eloquent 模型

试图在资源 Laravel 中返​​回数据透视表

在 Laravel 中使用 Eloquent 在模型中应用语句