在Laravel 5.8中返回响应之前处理数据中的关系

在Laravel 5.8中返回响应之前处理数据中的关系,laravel,orm,relationship,Laravel,Orm,Relationship,这是当前的回应: "id": 3, "name": "hello", "photo": { "id": 62, "address": "uploads/DKDH32kdsl29382dHW92387130.jpeg", } 我想要的是: "id": 3, "name": "hello", "photo": { "id": 62, "address": "http://mysite.domain/uploads/DKDH32kdsl29382dHW92387130

这是当前的回应:

"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();

实现你的目标的最好方法是使用一个。使用此功能,您可以访问address参数,但不必接收默认URI,您可以告诉Laravel返回完整的URL

/** *获取地址作为URL。 * *@param字符串$value *@返回字符串 */ 公共函数getAddressAttribute$value { 返回url$value; } 否则,如果要返回JSON响应,也可以使用,这是一个更好的解决方案,因为您不会每次访问该值时都对其进行修改,而只是在需要时进行修改

类模型扩展了JsonResource { /** *将资源转换为数组。 * *@param\light\Http\Request$Request *@return数组 */ 公共函数toArray$请求 { 返回[ //[…]其他属性 “地址”=>url$this->address, ]; } } 所以,假设您有一个Photo.php模型,您可以使用访问器修改地址以包含您的域

Photo.php:

然后,在控制器中:

return Model::select('id', 'name')
->with('photo:id,address,full_address')
->get();
return Model::select('id', 'name')
->with('photo')
->get();
注意:如果with中的完整_地址导致错误,您可以将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:id,address,full_address')
->get();
return Model::select('id', 'name')
->with('photo')
->get();