Laravel Eloquent 在结果中附加一个非关系数据

Posted

技术标签:

【中文标题】Laravel Eloquent 在结果中附加一个非关系数据【英文标题】:Laravel Eloquent appending a non-relation ship data with the result 【发布时间】:2021-06-30 19:03:02 【问题描述】:

我有这个模型文件:-

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Observation extends Model
    
        protected $fillable = ['observation', 'recommendation', 'priority', 'report_asset_id'];
        protected $appends = ['facility'];
    
        public function attachments()
        
            return $this->hasMany('App\ObservationAttachment');
        
    
        public function report_facility()
        
            return $this->belongsTo('App\ReportFacility');
        
    
        public function getFacilityAttribute()
        
            return $this->report_facility()->facility;
        
  

这是我的查询代码:-

$observations = Observation::orderBy('created_at','desc')
       ->with('attachments')->get(); 

       return response()->json($observations);

我正在尝试将 getFacilityAttribute 附加到结果数组中。

我尝试使用受保护的 $append 模型数组但出现错误:-

调用未定义的方法 Illuminate\Database\Eloquent\Relations\BelongsTo::facility()

【问题讨论】:

【参考方案1】:

以下行不正确:

return $this->report_facility()->facility

您正在启动一个查询,将 report_facility 作为函数 (report_facility()) 调用,返回一个查询构建器对象,其中 facility 函数是未知的。

你应该这样做:

return $this->report_facility->facility

在这种情况下,eloquent 将为您提供 ReportFacility 模型,您可以从中检索设施属性或关系。

类似于:

return $this->report_facility()->first()->facility

【讨论】:

另外,很高兴使用return optional($this->report_facility)->facility;

以上是关于Laravel Eloquent 在结果中附加一个非关系数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - 附加与 SyncWithoutDetaching

将 Laravel 集合附加到另一个集合

在 laravel 中定义 eloquent 关系时添加额外的约束

Laravel Eloquent:all() 的排序结果

在 Laravel 5 Eloquent 中获取原始 SQL 查询的结果

Laravel Eloquent:如何排序相关模型的结果?