Laravel-有什么方法可以在不使用sql连接的情况下以json格式检索图像文件名及其完整URL



我在Laravel中编写了一些代码,以仅显示mysql数据库中的图像,在Post表中。

这是显示图像的功能

public function index()
{
   $posts = Post::all()->pluck('image');
   return response()->json(['images' =>  $posts]);
}

这是我得到的响应,它在 JSON 数组中显示图像文件名

{
    "images": [
        "1509695371.jpg",
        "1509696465.jpg",
        "1509697249.jpg"
    ]
}

但我想用完整的 URL 显示它们,就像下面的 json 格式一样。在该函数中使用Laravel雄辩会更好,但不使用sql连接。

{
    "images": [
        "http://localhost:8000/images/1509695371.jpg",
        "http://localhost:8000/images/1509696465.jpg",
        "http://localhost:8000/images/1509697249.jpg"
    ]
}

任何帮助将不胜感激!

您可以在集合上使用映射方法:

public function index()
{
   $posts = Post::all()->pluck('image')->map(function($image){
        return "http://localhost:8000/images/".$image;
    });
   return response()->json(['images' =>  $posts]);
}

一种解决方案是创建一个资产服务,它可以有将路径附加到图像的方法:assetLink('images', $image)

为此提供了一个示例实现:

public function link(string $path, string $fileName): string
{
    return sprintf(
        '%s/%s/%s',
        env('APP_URL'),
        $path,
        $fileName,
    )
}

现在,您需要附加到多个路径。只需创建一个单独的方法,该方法采用数组并使用上述方法对其进行迭代。再比如:

public function linkArray(string $path, array $files): array
{
    return array_map(function ($fileName) {
        return $this->link($path, $fileName)
    }, $files)
}

然后你可以这样称呼它:$assetsService->linkArray('images', $files) .请记住,您可以使用依赖注入来获取由 laravel 的容器实例化的服务。

这为您提供了一组可重用的文件路径方法,而不会使数据库执行不必要的工作。服务是小班的,成本很低,但给你很多透明度。您可以定义使用服务的目的或何时将某些内容定义为服务。

这可以通过一个简单的循环来处理:

$posts = Post::all()->pluck('image');
foreach($posts AS $index => $image){
  $posts[$index] = url("/images/".$image);
}

url()帮助程序根据您的配置和传递的路径返回完全限定的 URL,因此

url("/images/1509695371.jpg")

应该返回

http://localhost:8000/images/1509695371.jpg

编辑:要包含所有数据,但仍images格式,您需要删除->pluck()函数和循环$posts,然后$post->images

$posts = Post::all();
foreach($posts AS $post){
  foreach($post->images AS $index => $image){
    $posts->images[$index] = url("/images/".$image);
  }
}

最新更新