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

事情是这样的,有天写了一个左连接查询,由于表名太长,所以分别给起个别名,代码如下:

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 模型使用软删除-左连接查询-表起别名示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决laravel查询构造器中的别名问题

    Laravel框架对数据库的封装是比较完善的,用起来也比较方便.但之前有一个问题一直困扰着我,就是利用laravel作查询时.如果想给表名或是字段名起别名是比较麻烦的事.但翻阅它的文档不难发现,它提供了一个DB::raw()的方法给我们,利用这个方法,我们就可以轻松的实现对表的重命名. 问题还原: 一般的写法:DB::table('users')->select('id','username')->get(); 这样写是一点问题没有的. 加别名的写法:DB::table('users as t

  • 详解Laravel设置多态关系模型别名的方式

    作为 Laravel 的重度使用者肯定都对多态关系不默生,以官方文档为例,文章有标签,视频有标签,那么文章和视频这些模型与标签模型的关系就是 多态多对多(Many To Many (Polymorphic)) 如果我们给 ID 为 1 的文章打上两个标签,数据库标签关系表的的存储结果就是这样子: > select * from taggables; +--------+-------------+---------------+ | tag_id | taggable_id | taggable

  • 浅谈laravel aliases别名的原理

    在laravel发现有些类可以直接use 类名,就能使用了,例如use DB;就可以使用DB类了,问题是DB这个类并不在根命名空间,这里面实际就是用到了别名. 先通过如下例子来分析基本原理 建立如下文件upload.php,内容为 <?php namespace test\test2; class upload{ public function test(){ return 123; } } 2 建立文件index.php,内容为 <?php namespace b; require('upl

  • laravel 获取当前url的别名方法

    如下所示: Route::get('/xiongtest', [ 'as' => 'xiong.test', 'uses' => 'XiongTestController@index' ]); 以上路由为例 在模版中可以使用route('xiong.test')来获取该路由的真实地址. 在XiongTestController@index中,可以使用以下方法获取路由别名 public function index(Request $request) $routeAction = $reques

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

    事情是这样的,有天写了一个左连接查询,由于表名太长,所以分别给起个别名,代码如下: 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); } 执行后,报错

  • Laravel 实现数据软删除功能

    对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes 这个  trait .软删除功能需要实现的功能有以下几点: 1.模型执行删除操作,只标记删除,不执行真正的数据删除 2.查询的时候自动过滤已经标记为删除的数据 3.可以设置是否查询已删除的数据,可以设置只查询已删除的数据 4.已删除数据可以恢复 Model的软删除功能实现 Illuminate\Database\Eloquent\Model 中delete

  • Mysql join连接查询的语法与示例

    连接查询: 是将两个查询(或表)的每一行,以"两两横同对接"的方式,所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行.进行"横向对接",得到一个新行. 连接查询包括以下这些不同形式,连接方式: 交叉连接.内连接.外连接(分:左外连接,右外连接) 连接查询语法: select * from 表名 [连接方式] join 表名 [on 连接条件] where ...; 测试数据: mysql> select * from test; +----+----

  • 三表左连接查询的sql语句写法

    今天要查询所有realname的username,psw,gname,tel 表结构: 表t1 字段名:t1_id,username,psw 表t2 字段名:t2_id,gname,t1_id //这里一个t1_id对应多个t2_id t3 字段名:t3_id,realname,tel,t1_id //这里一个t1_id对应一个t3_id 遇到的麻烦是当一个realname在t2表中没有内容时,也要将此realname的username,psw,tel等显示出来,直接使用 sql="select

  • yii框架表单模型使用及以数组形式提交表单数据示例

    按Yii文档里的描述,Yii在处理表单的一般过程是: 创建表单对应的模型类,设置字段验证规则创建表单提交对应的action,处理提交的内容在视图中创建表单form在刚刚的一个小项目里,想使用ajax提交表单信息并验证保存,又不想用隐藏iframe来做无刷新提交,并且action中能够用到模型类的校验方法,就想到使用表单数组提交的方式,举个例子: form代码: 复制代码 代码如下: <form action='' method='post' name='form_test'>    <i

  • Entity Framework Core实现软删除与查询过滤器

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布后,功能可能存在变动. 继续探索Entity Framework Core 2.0,今天我将探讨如何轻松使用软删除(或逻辑删除).我的意思是以透明的方式实现软删除,例如,您是物理上的删除行. 要实现软删除,您需要添加一列以指示该行数据是否被逻辑删除.如果您想知道该行被删除,可以使用布尔列,如果您想知道删除的时间,可以使用日期列.其次是更改所有查询,使用此列过滤结果集:您还

  • mybatis同一张表多次连接查询相同列赋值问题小结

    最近遇到的一些问题总结: 1. MySQL数据库同一张表做四次左连接查询数据冗余. a. mysql数据库连接查询 b. mysql表数据去重 2. mybatis查询相同列赋值重复问题. a. 使用mybatis强大的resultMap b. mysql数据查询别名 数据库表为 Create Table CREATE TABLE `STUDENT_SCORE` ( `score_id` int(11) unsigned NOT NULL AUTO_INCREMENT,//主键 `test_id

  • 详解MySQL中的分组查询与连接查询语句

    分组查询 group by group by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

  • 详解MySql基本查询、连接查询、子查询、正则表达查询

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SELECT语句来查询数据的.在这一章中将讲解的内容包括. 1.查询语句的基本语法 2.在单表上查询数据 3.使用聚合函数查询数据 4.多表上联合查询 5.子查询 6.合并查询结果 7.为表和字段取别名 8.使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: create table STUD

  • MySQL笔记之连接查询详解

    连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据 当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几张表 参考表:employee 参考表:department 可以看到,上面两张表都有同一个字段d_id 当两张表含有相同意义的字段(可以不同名)时就可以进行连接查询 内连接查询 复制代码 代码如下: mysql> SELECT num, name, employee.d_id, sex, d_name, function    -> FROM employee,

随机推荐