laravel 表连接连接两张表查询如何只要某个字段和这个字段的统计集合

Laravel使用查询构建器实现对数据库(分组 联合 分页 排序)-Php与数据库-Php教程-壹聚教程网Laravel使用查询构建器实现对数据库(分组 联合 分页 排序)
本文章来为各位介绍一篇关于Laravel使用查询构建器实现对数据库(分组 联合 分页 排序)的例子,希望此例子能够对各位带来帮助。
1、连接查询(join)
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。下面这张图形象的展示了这几种连接查询所获取的结果集:
SQL连接查询
下面我们简单演示下内连接和左连接。我们将用户表users和文章表posts关联到一起进行查询,在此之前,我们先创建posts表,其字段及初始值如下:
文章表posts
其中user_id对应users表中的用户id。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
$users = DB::table('users')-&join('posts','users.id','=','posts.user_id')-&get();
dd($users);
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
$users = DB::table('users')-&leftJoin('posts','users.id','=','posts.user_id')-&get();
dd($users);
对应的输出结果为:
left join 查询结果
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:
$users = DB::table('users')-&join('posts',function($join){
&&& $join-&on('users.id','=','posts.user_id')
&&&&&&&& -&where('posts.id','&',1);
})-&get();
dd($users);
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
$users = DB::table('users')-&where('id','&',3);
$users = DB::table('users')-&where('id','&',2)-&union($users)-&get();
dd($users);
3、where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
$user = DB::table('users')-&where('name','=','Laravel')-&get();
dd($user);
如果操作符为&=&,该语句也可简化为:
$user = DB::table('users')-&where('name','Laravel')-&get();
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:
$user = DB::table('users')-&where('name','Laravel')-&orWhere('name','Academy')-&get();
更多where子句查询条件可查看Illuminate\Database\Query\Builder源码。
查询构建器使用orderBy方法对查询结果进行排序:
$users = DB::table('users')-&orderBy('id','desc')-&get();
dd($users);
根据代码可以看到orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,asc代表升序,desc代表倒序,上述代码输出为:
为了更好地演示分组,我们给数据表posts新增两个字段:cat_id和views,代表分类ID和浏览数:
posts表新增分类ID和浏览数
分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
$posts = DB::table('posts')-&('cat_id',DB::raw('COUNT(id) as num'))-&groupBy('cat_id')-&get();
dd($posts);
我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
$posts = DB::table('posts')-&select('cat_id',DB::raw('SUM(views) as views'))-&groupBy('cat_id')-&having('views','&',500)-&get();
dd($posts);
输出结果为:
加条件的分组查询结果
注意:having中的条件字段必须出现在select查询字段中,否则会报错。
查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:
$posts = DB::table('posts')-&skip(0)-&take(2)-&get();
dd($posts);
上一页: &&&&&下一页:相关内容本文讲的是Laravel 实现多字段登录的三种方法,
下面三种方法基本原理都是相同的。
使用 Laravel 自带认证系统,修改 /app/Http/Controllers/Auth/AuthController.php 文件,重写方法(原方法所在文件 /vendor/
下面三种方法基本原理都是相同的。
使用 Laravel 自带认证系统,修改 /app/Http/Controllers/Auth/AuthController.php 文件,重写方法(原方法所在文件 /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php):
namespace App\Http\Controllers\A
use Illuminate\Http\R // 增加该行
class AuthController extends Controller
protected $username = 'login';
protected function getCredentials(Request $request)
$login = $request-&get('login');
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
$field =& $login,
'password' =& $request-&get('password'),
修改 /app/Http/Controllers/Auth/AuthController.php 文件,这也是使用 Laravel 自带认证系统的一种方法。
namespace App\Http\Controllers\A
use Illuminate\Http\R // 增加该行
class AuthController extends Controller
// 修改这里
use AuthenticatesAndRegistersUsers, ThrottlesLogins {
AuthenticatesAndRegistersUsers::postLogin as laravelPostL
// 增加方法
public function postLogin(Request $request)
$field = filter_var($request-&input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
$request-&merge([$field =& $request-&input('login')]);
$this-&username = $
return self::laravelPostLogin($request);
重写登录功能
LoginRequest.php:
public function rules()
'login' =& 'required',
'password' =& 'required'
AuthController.php:
public function login(LoginRequest $request)
$field = filter_var($request-&input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
$request-&merge([$field =& $request-&input('login')]);
if ($this-&auth-&attempt($request-&only($field, 'password')))
return redirect('/');
return redirect('/login')-&withErrors([
'error' =& 'These credentials do not match our records.',
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
laravel 多字段登录、laravel实现登录、laravel 实现单点登录、laravel 查询指定字段、laravel 字段别名,以便于您获取更多的相关知识。
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
云栖社区()为您免费提供相关信息,包括
的信息,还有laravel 多字段登录、laravel实现登录、laravel 实现单点登录、laravel 查询指定字段、laravel 字段别名等
,所有相关内容均不代表云栖社区的意见!共被编辑 3 次
Table::select(DB::raw('age,count(id) count'))-&where('sex',1)-&groupBy('age')-&get()-&toArray();
Table::select(DB::raw('age,count(id) count'))-&where('sex',1)-&groupBy('age')-&get()-&toArray()
Table::select(DB::raw('age,count(id) count'))-&where('sex',1)-&groupBy('age')-&get()-&toArray()
我要该,理由是:
扫扫下载 AppLaravel SQL查询中first, pluck与lists方法的使用 - 豆芽丝
作者:douyasi
看到说明文档上面介绍,难免有些迷惑,还是亲自动手试试吧。
sql测试数据表
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT ' 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT ' 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('1', '张三', '', '$2y$10$DNXpTLallazQRUTfFjsmx.qe0lr8SjoM1f2B5muNFB6Fn4Ay/DVIa', null, ' 14:48:37', ' 14:48:41');
INSERT INTO `users` VALUES ('2', '李四', '', '$2y$10$6sK8ZZjHgK8kYxnceIrmoO1RdrXdOxZxbxFyFgpNlZI83ZHI9nO6y', null, ' 14:49:39', ' 14:49:42');
控制器测试方法
public function test()
$users = DB::table('users')-&get();
$user = DB::table('users')-&where('name', '张三')-&first();
$name = DB::table('users')-&where('name', '张三')-&pluck('name');
$names = DB::table('users')-&lists('name');
$name_email = DB::table('users')-&lists('name','email');
var_dump($users, $user, $name, $names, $name_email);
说明与总结
由运行结果截图我们不能得出这3个方法的区别。
first 方法是取得结果集数组中第一列数据,如果结果集为空则返回 null 。
pluck 方法是取得结果集第一列特定字段,它返回是字符串;
lists 方法是按照 key=&value 对的方式返回数组;它的参数最多两个,第一个参数作为键值(value),第二个参数作为键名(key)。在一张表中查询出一个字段相同,一个字段不同的记录
在一张表中查询出一个字段相同,一个字段不同的记录
字段1 &字段2
用sql语句实现查询,查询出
select distinct x.字段一,x.字段二
from a as x,a as Y
where x.字段一=y.字段一 and x.字段二!=y.字段二}

我要回帖

更多关于 laravel 联表查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信