Laravel 模型使用软删除-左连接查询-表起别名示例

网络编程 2025-03-23 19:20www.168986.cn编程入门

今日,长沙网络推广将为大家分享一篇关于Laravel模型使用软删除、左连接查询以及表起别名的示例文章。对于从事Web开发的同学们来说,这具有很好的参考价值,希望大家能够从中受益。

在实际开发中,我们经常会遇到需要进行数据库查询的情况。有一次,我在写一个左连接查询时,由于表名过长,为了提高代码的可读性和维护性,我决定给表起别名。下面是当时的代码:

```php

public function detail()

{

$result = TakeOrderModel::query()

->from('take_order as order')

->leftJoin('take_order_detail as detail', 'order.id', '=', 'detail.take_order_id')

->get();

dd($result);

}

```

执行这段代码后,我遇到了一个报错:Column not found: 1054 Unknown column 'take_order.delete_time'。原来,软删除查询条件的表名是全名,而我使用的别名并没有在查询条件中生效。

为了解决这个问题,我们需要深入了解Laravel的软删除机制。在软删除作用域(SoftDeletingScope)的源码中,我们可以看到在应用软删除作用域时,会使用`getQualifiedDeletedAtColumn`方法来获取完全限定的“删除时间”列名。这个方法会调用`qualifyColumn`方法,将列名与模型表名结合起来。我们需要确保在查询中使用正确的表名。

解决办法很简单,我们只需要在查询前设置表名即可。修改后的代码如下:

```php

public function detail()

{

$result = TakeOrderModel::query()

->setTable('take_order as order') // 设置表名

->leftJoin('take_order_detail as detail', 'order.id', '=', 'detail.take_order_id')

->whereNull(function ($query) {

$query->from('order')->whereNull('order.delete_time'); // 使用别名进行查询

})

->get();

dd($result);

}

```

在这个深秋的黄昏,我们的故事与一场数据库的奇妙冒险有关。在这个故事中,有一个叫做TakeOrderModel的英雄模型,它正在勇敢地面对一个挑战——处理冗长的表名。让我们看看它是如何施展魔法,将复杂的查询变得简洁而有力的。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by