在 Laravel 5.8 中返回响应之前处理数据中的关系
Posted
技术标签:
【中文标题】在 Laravel 5.8 中返回响应之前处理数据中的关系【英文标题】:Manipulate relationship in data before returned response in Laravel 5.8 【发布时间】:2020-01-31 22:28:29 【问题描述】:这是当前的回复:
"id": 3,
"name": "hello",
"photo":
"id": 62,
"address": "uploads/DKDH32kdsl29382dHW92387130.jpeg",
我想要的是这个:
"id": 3,
"name": "hello",
"photo":
"id": 62,
"address": "http://mysite.domain/uploads/DKDH32kdsl29382dHW92387130.jpeg",
我的意思是我想将我的网站地址连接到 photo 对象的 address 属性
最后这是我的代码:
return Model::select(
'id',
'name'
)
->with('photo:id,address')
->get();
【问题讨论】:
【参考方案1】:因此,假设您有一个 Photo.php
模型,您可以使用 Accessor
修改 address
以包含您的域。
Photo.php
:
class Photo extends Model
public function getFullAddressAttribute()
return "http://mysite.domain/".$this->address;
然后,在你的控制器中:
return Model::select('id', 'name')
->with('photo:id,address,full_address')
->get();
注意:如果with()
中的full_address
导致错误,您可以将visible()
与appends()
结合使用以包含它:
class Photo extends Model
protected $visible = ["id", "address", "full_address"]
protected $appends = ["full_address"];
public function getFullAddressAttribute() ...
然后在你的控制器中:
return Model::select('id', 'name')
->with('photo')
->get();
【讨论】:
【参考方案2】:实现目标的最佳方式是使用accessor。使用此功能,您可以访问 address
参数,但您可以告诉 Laravel 返回完整 URL,而不是接收默认 URI。
/**
* Get the adress as URL.
*
* @param string $value
* @return string
*/
public function getAddressAttribute($value)
return url($value);
否则,如果您要返回 JSON 响应,则可以使用 API Resource 执行相同操作,这是一个更好的解决方案,因为您不会在每次访问它时更改该值,而只是在需要时更改该值。
class Model extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
return [
// [...] other attributes
'address' => url($this->address),
];
【讨论】:
以上是关于在 Laravel 5.8 中返回响应之前处理数据中的关系的主要内容,如果未能解决你的问题,请参考以下文章
当表 laravel 5.8 中没有数据时,null 返回总和而不是 0
laravel 5.8 在 getenv 上返回 false
Laravel 5.8 验证在使用 Passport 失败后返回首页