Laravel存储:在foreach循环中重复“/Storage/”

kx7yvsdv  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(172)

我正在上传员工图片到一个基于Laravel的报告系统,当我试图获取报告评论行的创建者时,我试图带回员工图片。这些图片使用公共路径链接存储在数据库中。因此,当我使用Storage::url()函数将其转换为存储路径时,我应该准备好显示图像的存储链接。
但是这个foreach循环导致路径的/storage/部分在字符串内重复foreach循环运行的次数。
知道这是怎么回事吗
这是我的foreach循环:

foreach($report->lines as $line) {
 if($line->creator->employee->picture) {
  $line->creator->employee->picture = Storage::url($line->creator->employee->picture);
 }
}

creator是用户和报表之间的关系,employee是用户在系统中作为员工的配置文件,员工有图片。
当我查看响应数据时,我得到了这样的结果:

/storage//storage//storage//storage//storage//storage//storage//storage//storage/images/b9570720-bd02-4e66-957d-93574ad753b6.jpg
l7wslrjt

l7wslrjt1#

将转换后的值赋值给$line->creator->employee->picture看起来像是罪魁祸首和反模式:employee对象的“picture”字段将被分配一个不是来自数据库的值。
您可以通过转换到URL来避免这种情况,其中使用的值(例如在刀片文件中使用Storage::url(...)(如果显示的话),而不是在此循环中。这避免了将值分配回模型,因为它只是在输出时使用转换。
您还可以在此循环期间为雇员设置一个新属性(例如$line->creator->employee->picture_url = Storage::url(...)),然后渲染它,而不是更改picture的值。
或者,您可以从输入中删除/storage/:但是这仍然是给picture赋值,这似乎不是一个好的计划,因为您的employee对象是为了表示而被更改的。

r7xajy2e

r7xajy2e2#

作为附加信息......相同的原则适用于雇员模型的其他示例:

foreach($report->collabs as $collab) {
 if($collab->picture) {
  $collab->picture = Storage::url($collab->picture);
 }
}

该循环用于更改员工的图片,但不是在注解行中,而是作为报告中的协作者声明。
这一切都很完美

vq8itlhq

vq8itlhq3#

谢谢你Erik Woodsmiken32,你都是正确的,我的印象是,一旦你得到了集合,该集合的工作更像一个数组,并且具有相互独立的对象和关系,所以一个行创建者与另一个不同,即使是相同的id。我测试并了解到,如果您修改一行的“employee”,其中该employee是相同的,那么get也会更改,我认为这只会发生在您将更改保存为save()之前。
我最后做的是这样的:

foreach($report->lines as $line) {
    if($creator = $line->creator) {
        if($employee = $creator->employee) {
            if($employee->picture && !strpos($employee->picture, 'storage')) {
                $line->creator->employee->picture = Storage::url($employee->picture);
            }
        }
    }
}

在应用更改之前,我正在检查图片是否已转换为存储。
我们非常欢迎对这一做法提出任何意见。

相关问题