为了账号安全,请及时绑定邮箱和手机立即绑定

拉拉维尔附加访问器意外地也增加了与响应的关系

拉拉维尔附加访问器意外地也增加了与响应的关系

PHP
米琪卡哇伊 2022-09-30 16:22:30
我有一个如下“Vehicle”类:(为了保持简单,我删除了很多方法和可填充物)<?phpnamespace App;use Illuminate\Database\Eloquent\Model;use App\Trip;class Vehicle extends Model{    public $fillable = [       ...    ];    protected $appends = [        'LastTrip'    ];    public function trips()    {        return $this->hasMany(Trip::class);    }    public function getLastTripAttribute()    {        return $this->trips->last();    }}问题是,当我从控制器返回此类的实例时。它序列化了“旅行”关系,因此每次旅行都在我的响应中。然而,这只发生在我试图附加'LastTrip'访问器。如果我将其更改为以下内容,则问题不会持续存在protected $appends = [    #'LastTrip'];我只是试图让它序列化“LastTrip”访问器。我希望我把我的问题说清楚了,请让我知道,如果我可以应用任何进一步的信息。感谢您的帮助。
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

发生这种情况是因为您的访问器执行以下操作:

  1. 加载完整行程关系

  2. 将行程集合中的最后一个项目设置为last_trip属性。

将代码更改为以下内容:

public function getLastTripAttribute()

{

    // If the relation is already loaded, avoid doing an extra SQL query

    if ($this->relationLoaded('trips')) {

        return $this->trips->last();

    // Otherwise, get the last trip from an SQL query.

    } else {

        return $this->trips()->orderByDesc('id')->first();

    }

}


查看完整回答
反对 回复 2022-09-30
?
青春有我

TA贡献1784条经验 获得超8个赞

编辑:

当您调用时,它会获取所有行程,然后将最后一个行程分配给LastTrip。但是,如果您在“行程”之后使用括号,则它必须从数据库中仅获得1行,请尝试以下操作:$this->trips->last()

public function getLastTripAttribute(){ 
   return $this->trips()->latest()->first();
}

public function getLastTripAttribute(){ 
   return $this->trips()->orderByDesc('id')->first();
}


查看完整回答
反对 回复 2022-09-30
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信