在Laravel框架中,软删除是一个常用的功能,它允许在不从数据库中实际删除记录的情况下,通过设置一个特定的时间戳字段来“删除”数据记录。这种做法的好处是可以方便地实现数据的恢复,并且避免了可能由于硬删除导致的外键约束问题。本文主要介绍在Laravel中使用软删除模型时,如何进行左连接查询以及如何为表设置别名。 Laravel框架通过SoftDeletes trait来支持软删除功能。该trait会自动为模型类添加deleted_at字段,并且在Eloquent的查询构建器中添加了一个作用域(scope),用来筛选那些未被软删除的数据。默认情况下,这个作用域会检查deleted_at字段是否为null,即未设置删除时间戳。 接下来,关于左连接(LEFT JOIN)查询,这是SQL中常用的连接查询方式之一,用来查询两个表中相关联的数据,并且返回左表(FROM指定的表)的所有记录,即使右表中没有匹配的记录也会返回左表中的记录,右表中不匹配的记录将被填充为NULL。 在本文中,作者遇到的一个问题是由于表名太长,为了避免在多次引用表名时代码过于冗长,所以使用了SQL的AS关键字来为表名起别名。例如: ```sql SELECT * FROM `take_order` AS `order` LEFT JOIN `take_order_detail` AS `detail` ON `order`.`id` = `detail`.`take_order_id` ``` 在这种情况下,作者尝试使用了软删除,却发现报错提示找不到列`take_order.delete_time`。这是因为虽然为表`take_order`起了别名`order`,但是在执行软删除作用域查询时,由于作用域的源码中会对字段名进行完整的限定(即表名+列名),所以当作用域尝试通过`$this->getQualifiedDeletedAtColumn()`方法来获取限定列名时,由于别名并没有在全局范围内有效,导致查询失败。 通过查看Laravel框架内SoftDeletingScope作用域和qualifyColumn方法的源码,我们可以了解到,当列名中包含`.`(点号)时,系统会认为它已经是一个完整的限定名称,否则就会使用`$this->getTable().'.'.$column`的方式来生成完整的限定名称。如果在SQL查询中使用了别名,由于别名不属于完整的限定名称,从而导致了字段无法找到的错误。 最终解决方案如下: ```php $result = (new TakeOrderModel()) ->setTable('take_order') // 这行代码将模型关联到正确的表名 ->from('take_order as order') ->leftJoin('take_order_detail as detail', 'order.id', '=', 'detail.take_order_id') ->get(); ``` 在这段代码中,通过`setTable('take_order')`显式地设置了模型对应的表名,这样即使在后续的查询中使用了别名`order`,作用域依然能够正确地找到未被软删除的记录。 总结来说,在使用Laravel进行左连接查询并且为表设置了别名的情况下,如果需要应用软删除功能,就必须显式地在查询中指定模型关联的真实表名。这是因为在左连接查询中使用了表别名后,Laravel框架的软删除作用域可能无法正确识别完整的列名路径,从而导致错误。正确地指定表名后,软删除条件才能够正确应用,而查询依然可以使用别名以简化代码并提高可读性。





























- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 下周我校将举办人工智能利与弊为主题的演讲比赛英语作文.docx
- 电子商务企业盈利模式研究的开题报告.docx
- 三层电梯PLC程序说课材料.ppt
- 福建师范大学2021年9月《软件工程》作业考核试题及答案参考10.docx
- sas卡方检验编程语句(2).ppt
- 电子商务实验二网上购物实验报告.doc
- 万朋微课掌上通着力推进教育信息化发展.docx
- 2023年计算机基础知识试题及答案新编(1).doc
- 任务驱动法在中职计算机教学中的应用(1).docx
- cad2006自学教程第6章基本三维绘图.ppt
- 软件工程大作业.doc
- TransCAD四阶段法基本操作步骤.doc
- 软件项目沟通方案.docx
- 如何构建特色卫生监督服务型网站说课材料.ppt
- 物联网说课讲解.ppt
- python加速效验算法问题.docx


