在 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 失败后返回首页

Laravel 5.8 验证错误返回到所有输入的特定视图-> 旧的不起作用

Laravel 5.8 中的异常处理

Laravel 5.8控制器索引函数返回空白页