我有一个如下“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个赞
发生这种情况是因为您的访问器执行以下操作:
加载完整行程关系
将行程集合中的最后一个项目设置为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();
}
}
青春有我
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(); }
- 2 回答
- 0 关注
- 91 浏览
添加回答
举报
0/150
提交
取消