【问题标题】:Return URL image in Laravel API在 Laravel API 中返回 URL 图片
【发布时间】:2020-05-22 05:27:49
【问题描述】:

我需要从数据库中返回 URL 路径和名称图像。

这是我从数据库中获取数据的调用方法:

public function index(){
    $rav=Rav::select('id','image','nameravs')->get('image');
    return $this->sendResponse($rav->toArray(),'rav show is succesfuly');
}

输出数据如下:

{ “身份证”:88, "图像": "1579781806.png", “nameravs”:“asdad” },

但我想用这样的路径 URL 返回图像:

“图片”:http://127.0.0.1:8000/images_ravs/1579781806.png

【问题讨论】:

    标签: json laravel


    【解决方案1】:

    在模型中你可以创建getAttribute:

       public function getImageAttribute()
        {
          return $this->attributes['image'] ? URL::to('/uploads/' . $this->attributes['image']) : null; 
        }
    

    或者您可以创建自定义casts 文件:

        protected $casts = [
            'image' => ImageCast::class,
            'created_at' => 'datetime',
            'updated_at' => 'datetime',
        ];
    

    【讨论】:

      【解决方案2】:

      像这个例子一样在你的模型中定义一个访问器:

      public function getImageAttribute($value)
      {
          return env('APP_URL') . Storage::url($value);
      }
      

      【讨论】:

        【解决方案3】:

        我会这样做:尝试尽可能多地使用 od Laravel 的内置函数。在大多数情况下,您不需要重新发明轮子。

        public function index(){
           $ravs = Rav::select('id','image','nameravs')->get();
           $results = [];
        
           foreach($ravs as $rav){
              $rav->image = env('APP_URL') . '/images_ravs/' . $rav->image;
              array_push($results, $rav);
           } 
           return response()->json($results);
         }
        

        【讨论】:

        • 由于$rav 包含多个项目,您需要添加foreach 循环以将图像数组值添加到每个数组。
        • 因为 get 会返回一个 Collection 并且 toArray 会将该集合转换为 Array ,这就是这种情况。如果您有 10 个 ravs,并且需要修改每个数组的值,则需要 foreach 迭代数组并修改键。
        • 是的,我假设只有一个对象,但是是的,我需要用 ->first() 替换 ->get(),但没有 where 声明
        • It is not recommended to use env(),就像在生产环境中缓存配置时一样,它将返回 null。请改用config()
        【解决方案4】:

        您可以使用Eloquent Accessor

        Rav.php 模型中添加图片 url 属性,如下所示。那么你可以在任何地方访问它。

            public function getImageUrlAttribute($value)
            {
                return env('APP_URL'). '/images_ravs/' . $this->image;
            }
        

        别忘了在Model 中添加Appends 属性

        /**
         * The accessors to append to the model's array form.
         *
         * @var array
         */
        protected $appends = ['image_url'];
        

        然后你可以像下面这样访问它。

        $rav->image_url 
        

        【讨论】:

          【解决方案5】:

          您可以将selectRawselectDB::raw 一起使用,并且只需将concat 该路径作为查询中image 列前面的前置字符串:

          Rav::select(DB::raw("id, nameravs, CONCAT('/images_ravs/', image) as image"))->get()->toArray();
          

          无需包含 URL(除非由于某种原因您在其前面有某种类型的 CDN),在这种情况下,您只需转义字符串并在必要时添加它。

          【讨论】:

            【解决方案6】:

            试试这个:

            public function index(){
                $rav = Rav::select('id','image','nameravs')->get('image');
            
                return $this->sendResponse(
                    [
                        'id' => $rav->id,
                        'image' => URL::to('/').'/images_ravs/'.rav->image,
                        'nameravs' => $rev->nameravs
                    ],'rav show is succesfuly');
            
             }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-11-15
              • 2019-09-21
              • 2019-01-25
              • 1970-01-01
              • 2017-10-28
              • 1970-01-01
              • 2017-02-04
              • 2011-11-05
              相关资源
              最近更新 更多