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

我有一个如下“Vehicle”类:(为了保持简单,我删除了很多方法和可填充物)


<?php


namespace 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”访问器。


我希望我把我的问题说清楚了,请让我知道,如果我可以应用任何进一步的信息。


感谢您的帮助。


米琪卡哇伊
浏览 92回答 2
2回答

斯蒂芬大帝

发生这种情况是因为您的访问器执行以下操作:加载完整行程关系将行程集合中的最后一个项目设置为last_trip属性。将代码更改为以下内容:public function getLastTripAttribute(){&nbsp; &nbsp; // If the relation is already loaded, avoid doing an extra SQL query&nbsp; &nbsp; if ($this->relationLoaded('trips')) {&nbsp; &nbsp; &nbsp; &nbsp; return $this->trips->last();&nbsp; &nbsp; // Otherwise, get the last trip from an SQL query.&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; return $this->trips()->orderByDesc('id')->first();&nbsp; &nbsp; }}

青春有我

编辑:当您调用时,它会获取所有行程,然后将最后一个行程分配给LastTrip。但是,如果您在“行程”之后使用括号,则它必须从数据库中仅获得1行,请尝试以下操作:$this->trips->last()public&nbsp;function&nbsp;getLastTripAttribute(){&nbsp; &nbsp;&nbsp;&nbsp;return&nbsp;$this->trips()->latest()->first(); }或public&nbsp;function&nbsp;getLastTripAttribute(){&nbsp; &nbsp;&nbsp;&nbsp;return&nbsp;$this->trips()->orderByDesc('id')->first(); }
打开App,查看更多内容
随时随地看视频慕课网APP