最适合入门的Laravel初级教程(九)数据库查询Query Builder

到这 articles 表已经有一些数据了;
我们可以讲查询数据的方式了;
接着上篇文章加路由和控制器方法;

Route::prefix('database')->group(function () {
    Route::get('insert', 'DatabaseController@insert');
    Route::get('get', 'DatabaseController@get');
});

在控制器增加了个 get 方法;

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;

class DatabaseController extends Controller
{
    /**
     * 插入数据
     */
    public function insert()
    {
        DB::table('articles')->insert([
            [
                'category_id' => 2,
                'title' => '文章2',
                'content' => '内容2'
            ],
            [
                'category_id' => 3,
                'title' => '文章3',
                'content' => '内容3'
            ],
        ]);
    }

    /**
     * 查询数据
     */
    public function get()
    {
        $data = DB::table('articles')->get();
        dump($data);
    }

}

DB table 选中表 调用 get 方法就可以获取全部的数据;
dump 是 laravel 的打印函数;
可以把它理解为 php 的 var_dump 函数的升级版;
访问 database/get

三角箭头表示是可以点击收起展开的;
按着 ctrl/cammand 键再点击三角箭头;
就可以展开或收起其下的全部数据;

但是实际开发中;
其实大多时候都不会取全部数据;
一般会有限制语句;

/**
 * 查询数据
 */
public function get()
{
    $data = DB::table('articles')
        ->where('id', 1)
        ->get();
    dump($data);
}

DB 有个 where 方法;
第一参数就是字段名;
第二个参数是值;
->where('id', 1) 表示限制 id 为 1;
那如果想取 id 不为 1 的数据呢?
where 可以接受第 3 个参数;
如果传 3 个参数;
第一个参数还是字段名;
第二个参数是符号;
第三个参数是值;
->where('id', '<>', 1)
那自然也是可以传 >< 了;
sql 中还有个 IN 的用法;
laravel 中就是 whereIn()
第一个参数还是字段名;
第二个参数是数组;
那取 id 为 1、2、3 的数据就这样写了;
->whereIn('id', [1, 2, 3]) ;
NOT IN 就是 whereNotIn()
Between 同理;
关联表就是 join 了;
可以传3个参数;
第一个参数就是要关联的表名;
可以使用 as 给表定义别名;
当表比较长的时候会比较方便;
第二个和第三个分别是关联的字段;
谁在前谁在后无所谓哈;
->join('users as u', 'u.id', 'articles.user_id') ;
如果使用了 join 那 where 就同样要指明表了;
->whereIn('u.id', [1, 2, 3]) ;
联系到 sql 还会有 left join 和 right join ;
使用驼峰命名法即可;
->leftJoin('users as u', 'u.id', 'articles.user_id') ;
分组和排序的则需要在关键字后面加个 by;
->groupBy('u.id');
orderBy 还可以指定第二个参数用于指定正序还是倒序;
orderBy('created_at', 'desc')
如果只想取指定字段的可以使用 select ;
->select('u.id', 'u.name', 'u.email');
相应的最后的 ->get() 还可以替换为 firstcountsumpluckvalue;
count 、 sum 这俩就不说了翻译意思就明白;
当我们要一个数据列表的时候使用 get 得到的是 2 维数组;

当我们只取一条数据的时候使用 first 得到的是 1 维数组;

当我们要一个数据列表但只要某个字段的时候使用 pluck ;
pluck 接受 2 个参数;
第一个参数是我们要取的字段;
第二个字段是可以选的;用来做 key ;
举个栗子;
->pluck('content', 'title') 得到的就是下图的数据;

value 就简单了它获取的是一个值;
->value('title') 得到的是 "文章2" ;
最后我们来个稍完整点的示例结束本篇;

$data = DB::table('articles')
    ->select('category_id', 'title', 'content')
    ->where('title', '<>', '文章1')
    ->whereIn('id', [1, 2, 3])
    ->groupBy('category_id')
    ->orderBy('id', 'desc')
    ->limit(1)
    ->get();
dump($data);

如果你使用的是 5.7 的mysql;
运行上面这段代码报 sql_mode=only_full_group_by 的错误;
回到 config/database.php 文件;
把 mysql 中的 strict 改为 false 即可;
至于为啥报这个错;
这又是一个扩展题自行搜索了解吧;

白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共8条评论
白俊遥博客

xietianliao:在学习中

2018-04-25 17:12:48 回复

白俊遥博客

く义能づ:大神

2018-03-26 21:36:15 回复

白俊遥博客

蒲公英:感谢,

2018-02-23 09:35:46 回复

白俊遥博客

沵→涐的№1:上一篇 下一篇 问题,不同类目下的文章,要是运用排序后,上一篇,下一篇的 不会根据排序的顺序来,还是根据ID来的 ! 这个bug 发现了吗?

2018-02-12 09:59:30 回复

白俊遥博客
  • 云淡风晴 回复 沵→涐的№1:thinkphp 版本的博客之前是判断了;后来觉得判断的问题比较多;以及url的问题;给取消了;容我有空了加上判断;
  • 2018-03-04 22:44:02 回复
白俊遥博客

记忆宫殿之旅:写得好,目前不知道user表和password怎么用看5.1视频文件变了所以感觉有限制,自动填充估计和tp中自动完成的功能差不多

2018-02-04 18:46:04 回复

白俊遥博客
  • 云淡风晴 回复 记忆宫殿之旅:过后单独开篇文章讲解哈;
  • 2018-02-05 00:24:49 回复
白俊遥博客

rk:去年就想抽时间深入学习Laravel想不到开年来有缘有到博主这篇系列入门教程,是讲Laravel工作原理的好案例,通俗易懂,好好学习,天天向上。

2018-02-03 19:20:53 回复

白俊遥博客
  • 云淡风晴 回复 rk:现在可以开始学了;
  • 2018-02-05 00:25:15 回复
白俊遥博客
  • rk 回复 云淡风晴:已composer 安装laravel整装待发
  • 2018-02-05 08:27:36 回复
白俊遥博客
  • 南乡子 回复 云淡风晴白俊遥博客
  • 2018-02-13 22:06:50 回复
白俊遥博客

WuHuaJi0:挺好的 博客

2018-01-29 18:02:29 回复

白俊遥博客

FBLMG:能否交换友链,博主

2018-01-29 14:18:08 回复

白俊遥博客
  • 狠拽灬↘嘛 回复 FBLMG:?
  • 2018-04-23 21:50:11 回复