大家有没有在实际项目中用过 laravel-medialibrary 这个扩展包

一直知道这个包挺牛叉,这次项目想用他试试,但是刚开始就遇见一个觉得很致命的问题,想问下使用过的大神们都是如何处理的

比如我产品模型实现 laravel-medialibrary 的 HasMedia 接口,当给产品添加图片时,就会自动在 media 表存一条记录,model_type = product, model_id = 产品 id

但是当我下单购买这个产品时,我如何把这个产品的图片记录到订单商品表中呢?

目前想到的办法有如下几种,但是感觉都不太行

  • 下单时订单表不存图片信息,显示图片时,直接关联商品去拿图片

    这样做是简单了,但是产品被删,订单的图片就丢失了

  • 下单时,拿到产品的图片,将图片移动到订单相关的一个目录中(如果之前已经移动过了,就不处理),把图片地址存入订单表

    样做可以保证如果产品被删除了(关联的图片也会被删除 扩展包默认的处理方式),订单上的图片还能照常显示,但是图片还是会存在冗余,并且这逻辑有点怪怪的

  • 下单时,复制购买商品的 media 图片信息,然后再在 media 表添加一条新纪录,关联订单

    这样不怕产品删除了,但是这个商品如果被购买了很多次,media 将有大量关联订单的冗余数据

  • 再建一个 media_order 表,记录订单 和购买的那条产品 media 的关系,订单也读同一条media 记录,然后如果要删除产品,判断 media_order 表是否有要删除图片相关的记录,如果有,就不删除 media

    这样只要产品被购买过,那 media 几乎无法被正常删除了,并且media 关联的产品都已经丢了,数据上就不完整

为了用这个包也是绞尽脑汁了,有没有大神指点一二,感谢

目前国内设计思维好像都是这样的:建一个 media 表,表中直接存入 url,和一些信息,再写一个 media 管理页面,然后上传图片时候,打开 media 管理页,然后从里面选择要使用的图片或者上传新的,选择完之后,把图片 url 存入比如 产品表中;也就是 产品和 media 是没有任何关系的

感觉 laravel-medialibrary 有点不符合国内使用习惯:cold_sweat:

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 13

没必要,京东也是按照你的第一个方案,每个方案都有利有弊,选择合适的就行,比如方案一使用软删除,方案2,无法展示商品最新封面

2天前 评论
Wsmallnews (楼主) 1天前

淘宝是快照。删了的商品信息还能正常显示。这个肯定不能直接删除吧。后期维权问题,比如商品与图片不符。

1天前 评论
Wsmallnews (楼主) 1天前
nff93

我的做法是快照,保存商品的关键信息。你用关联的话,商品信息修改了用户在订单里看着很奇怪。

1天前 评论
springlee 1天前
Wsmallnews (楼主) 1天前
Wsmallnews (楼主) 1天前
nff93 (作者) 12小时前

其实你看源码就知道答案了

file

file
默认行为是先会删除media MediaLibraryServiceProvider注册了观察者一旦删除media会触发MediaObserver而deleted逻辑是物理删除才会删除文件。这时候你理解了原理。我不告诉你答案是不是已经有办法去处理了

Laravel
这个也能阻止media删除。办法太多了:smile: :smile:
$product->deletePreservingMedia();这样就不会删除文件了

1天前 评论
Wsmallnews (楼主) 1天前
springlee (作者) 1天前
springlee (作者) 1天前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!