laravel查询构造器中别名的问题
Laravel框架对数据库的封装是比较完善的,用起来也比较方便。但之前有一个问题一直困扰着我,就是利用laravel作查询时。如果想给表名或是字段名起别名是比较麻烦的事。但翻阅它的文档不难发现,它提供了一个DB::raw()的方法给我们,利用这个方法,我们就可以轻松的实现对表的重命名。
问题还原:
一般的写法:DB::table('users')->select('id','username')->get();
这样写是一点问题没有的。
加别名的写法:DB::table('users as table1')->select('id')->get();
这样写也不会产生错误
我们尝试另一咱写法:DB::table('users as table1')->select('table1.id')->get();
这样写就报错了,但这种写法我们又是不能避免的,如我们要表users表进行自连接时,就必须要用到别名加点的方式去得到字段。这样问题就来了。
不着急,我们先看看这句话输出的SQL语句是什么样的。我们用laravel提供的一个方法toSql()去得到SQL语句
DB::table('usersas table1')->select('table1.id')->toSql();
结果为:select`ykttb_table1`.`id` from `ykttb_users` as `table1`
我们发现写table1.id时,laravel框架自动给我们加上了表前缀,很显然,这样的SQL语句得不到我们要的结果。
最后的尝试:DB::table('users astable1')->select(DB::raw('table1.id'))->get();
这样写就没错了,用上面的方法来输出SQL语句:select table1.id from `ykttb_users` as `table1`
这就是我们想要执行的SQL语句。
总结:在laravel中,给表起别名,直接写就可以;但在select语句中要用到表的别名来得到字段,我们就要在外面套一层DB::raw(),
$res = DB::table('topics')->select('topics.*', 'b.username',
'b.avatar', 'c.username as rname', 'd.cname')
->where('topics.is_hidden', 0)
->leftJoin('users b', 'b.uid', '=', 'topics.uid')
->leftJoin('users c', 'c.uid', '=', 'topics.ruid')
->leftJoin('nodes d', 'd.node_id', '=', 'topics.node_id')
->orderBy('ord', 'desc')
->take($limit)->get();
laravel查询构造器中别名的问题的更多相关文章
- Laravel查询构造器简介
数据表 CREATE TABLE IF NOT EXISTS students( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NO ...
- laravel查询构造器DB还是ORM,这两者有什么区别,各该用在什么场景中
解答一: 我们所有操作都是走的orm,因为操作简单 直观明了 好维护,性能是低一些 但还没有多致命,真有并发需要优化了 用DB也不一定能解决问题.还是要了解orm每个方法的意思,不然你可能一不小心就会 ...
- laravel 查询构造器2
//查询构造器 public function query() { //获取所有的数据 $student = DB::table('student')->get(); var_dump($stu ...
- laravel 查询构造器
//查询构造器public function query(){ $bool = DB::table('student')->insert([ ['name' => '王五', 'age' ...
- Laravel查询构造器的使用方法整理
1.结果集 1.1从一张表获取所有行,get方法获取所有行 $users = DB::table('users')->get(); 获取列的值 foreach ($users as $user) ...
- Laravel --- 查询字段中使用表达式
比如: select id, name, count(post) from ... 在laravel中: $user = $this ->select( 'id', 'name', DB::ra ...
- laravel中通过查询构造器,实现数据的curd
//查询构造器: public function query1(){ //利用查询构造器,插入数据: /*$num=DB::table('student')->insert( ['name'=& ...
- Laravel框架使用查询构造器实现CURD
一.什么是查询构造器? ①Laravel 查询构造器(query Builder)提供方便,流畅的接口,用来建立及执行数据库查找语法 ②使用PDO参数绑定,以保护应用程序免于SQL注入因此传入的参数不 ...
- laravel5.5中查询构造器的使用
//查询构造器新增数据: public function query1() { /* $bool=DB::table('student')->insert( ['name'=>'小李',' ...
随机推荐
- android开源项目---blog篇
本文转载于:http://blog.csdn.net/likebamboo/article/details/19081241 主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织.Follow大 ...
- Unity. Navigation和寻路
Navigation Static:不会移动.可以用于计算可行走区域.例如:地板.墙.静态障碍物. 将一个物体选为Navigation Static:Navigation窗口-> 勾选项
- int(M)与int
int(M) ,加上zerofill后M才表现出有点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10 ...
- CSS浮动讲解好文章推荐
经验分享:CSS浮动(float,clear)通俗讲解 http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 好文推荐!
- 8000401a 错误 ,检索 COM 类工厂中 CLSID 为 的组件时失败,原因是出现以下错误: 8000401a。
"/"应用程序中的服务器错误. -------------------------------------------------------------------------- ...
- unity, SerializedObject.FindProperty不要写在Editor的OnEnable里,要写在OnInspectorGUI里
如果像下面这样写: using UnityEngine;using System.Collections;using UnityEditor;using System.Collections.Gene ...
- 【转】ASP.NET Cookies简单应用 记住用户名和密码
不要试图给Password类型的TextBox赋值! 在asp.net中,不要试图给Password类型的TextBox控件赋值! 无论是在设计或是运行时,都不可以的. 猜测的原因是,password ...
- 【转】SVN的UUID错误
操作TortoiseSVN时,报如下错误: Command Update Repository UUID '62b86956-73d9-2945-ba87-0546d71898 ...
- python3_mechanicalsoup
python3_mechanicalsoup # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import mechanicalsoup # 事实证明,这个 ...
- Box Anemometer
https://sourceforge.net/projects/pydev/files/pydev/ Eclipse + Pydev 配置Python开发环境 JDK安装http://jingyan ...