我正在上传员工图片到一个基于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
3条答案
按热度按时间l7wslrjt1#
将转换后的值赋值给
$line->creator->employee->picture
看起来像是罪魁祸首和反模式:employee对象的“picture”字段将被分配一个不是来自数据库的值。您可以通过转换到URL来避免这种情况,其中使用的值(例如在刀片文件中使用
Storage::url(...)
(如果显示的话),而不是在此循环中。这避免了将值分配回模型,因为它只是在输出时使用转换。您还可以在此循环期间为雇员设置一个新属性(例如
$line->creator->employee->picture_url = Storage::url(...)
),然后渲染它,而不是更改picture
的值。或者,您可以从输入中删除
/storage/
:但是这仍然是给picture
赋值,这似乎不是一个好的计划,因为您的employee对象是为了表示而被更改的。r7xajy2e2#
作为附加信息......相同的原则适用于雇员模型的其他示例:
该循环用于更改员工的图片,但不是在注解行中,而是作为报告中的协作者声明。
这一切都很完美
vq8itlhq3#
谢谢你Erik Woods和miken32,你都是正确的,我的印象是,一旦你得到了集合,该集合的工作更像一个数组,并且具有相互独立的对象和关系,所以一个行创建者与另一个不同,即使是相同的id。我测试并了解到,如果您修改一行的“employee”,其中该employee是相同的,那么get也会更改,我认为这只会发生在您将更改保存为save()之前。
我最后做的是这样的:
在应用更改之前,我正在检查图片是否已转换为存储。
我们非常欢迎对这一做法提出任何意见。