事情是这样的,有天写了一个左连接查询,由于表名太长,所以分别给起个别名,代码如下:
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。
查看解决办法的,直接看底部
SQL:
select * from take_order as order left join take_order_detail as detail on order.take_order_id = detail.take_order_id where take_order.delete_time is null
显而易见:软删除查询条件的表名是全名,所以报错了。
分析
软删除作用域 SoftDeletingScope 源码:
/** * Apply the scope to a given Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { $builder->whereNull($model->getQualifiedDeletedAtColumn()); }
查看 getQualifiedDeletedAtColumn 源码:
/** * Get the fully qualified "deleted at" column. * * @return string */ public function getQualifiedDeletedAtColumn() { return $this->qualifyColumn($this->getDeletedAtColumn()); }
查看 qualifyColumn 源码:
/** * Qualify the given column name by the model's table. * * @param string $column * @return string */ public function qualifyColumn($column) { return $this->model->qualifyColumn($column); }
查看 qualifyColumn 源码:
/** * Qualify the given column name by the model's table. * * @param string $column * @return string */ public function qualifyColumn($column) { if (Str::contains($column, '.')) { return $column; } return $this->getTable().'.'.$column; }
以上可知: $this->getTable().'.'.$column 即为软删除条件的字段名。
解决办法
代码改成下面这样,加一行 setTable 设置表名,就可以了。
$result = (new TakeOrderModel()) ->setTable('order') ->from('take_order as order') ->leftJoin('take_order_detail as detail', 'order.take_order_id', '=', 'detail.take_order_id') ->get();
因为写代码时要指定具体的查询 columns ,有时表名真的太长,看着很不舒服,所以有此尝试。嗯,9 点了,下班。
以上这篇Laravel 模型使用软删除-左连接查询-表起别名示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
因为种种原因,现在大部分场景下,我们开发删除功能时,都不会将记录物理删除。 使用模型软删除功能非常简单,只需要在模型类中引入 trait Imi\Model\SoftDelete\Traits\TSoftDelete,并且在类上加上注解 @SoftDelete 示例 <?php namespace Imi\Test\Component\Model; use Imi\Bean\Annotatio
我正在将数据库从MySQL切换到Postgres SQL。在MySQL中有效的select查询在Postgres中也有效,但类似的delete查询却不能。 我有两个数据表,列出了某些备份文件的位置。现有数据(ed)和新数据(nd)。此语法将挑选出可能说明文件在现有数据表中的位置的现有数据,根据相等的文件名和路径对其进行匹配,但没有关于文件在新数据中的位置的信息: 我希望使用以下语法运行删除查询:
问题内容: 有人可以帮助我了解此查询的问题吗: 问题答案: 之所以无法使用,是因为MySQL不按照您尝试的方式在delete语句中支持连接语法。 使用: …或使用EXISTS:
假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?
我正在尝试使用Laravel雄辩的模型查询多个表,这些模型具有一对一、一对多和多对多的关系。 我有一个表,一个表,一个表和一个透视表。 每个表单有一个品牌和一个用户: 品牌没有任何外键: 用户没有任何外键: 有一个数据透视表可以创建多对多的关系,用于创建拥有许多用户(如品牌成员)的品牌组: 我试图通过直接所有权()或品牌成员身份获取属于用户的所有表单,通过多对多透视表获取用户所属的所有品牌的所有表
在JPA Spring数据中使用带有DELETE的别名是否存在任何已知的问题?同样的工作就像一个魅力移除别名。我有一个JPA Spring数据原生查询,如下所示:- 当我删除别名时,查询执行得很好。工作查询如下:- 在JPA Spring数据中使用带有DELETE的别名是否存在任何已知的问题?同样的工作就像一个魅力移除别名。 文档还显示了使用别名http://docs.spring.io/spri