前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 数据库交互 - 查询构造器

Laravel 数据库交互 - 查询构造器

作者头像
崔哥
发布2023-01-03 08:40:02
2.9K0
发布2023-01-03 08:40:02
举报
文章被收录于专栏:崔哥的专栏

获取结果

从表中检索所有行

代码语言:javascript
复制
        $articles = DB::table('article')->get();
        foreach ($articles as $article) {
            echo $article->title.PHP_EOL;
        }

从表中检索单行或单列

代码语言:javascript
复制
        #通过id字段获取一行
        $article = DB::table('article')->find(3);
        #获取一行
        $article = DB::table('article')->where('title', '339911y')->first();
        echo $article->content.PHP_EOL;
        #从纪录中提取单个值
        echo DB::table('article')->where('title', '339911y')->value('content').PHP_EOL;

获取某一列的值

代码语言:javascript
复制
        $titles = DB::table('article')->pluck('title');
        foreach ($titles as $title) {
            echo $title.PHP_EOL;
        }
        #从表中检索单行或单列
        $regions = DB::connection('mysql2')->table('regions')->pluck('name', 'code');

        foreach ($regions as $code => $name) {
            echo $code.' => '.$name.PHP_EOL;
        }

分块结果

代码语言:javascript
复制
        #以一次 1000 条记录的块为单位检索整个 regions 表。
        DB::connection('mysql2')->table('regions')->orderBy('id')->chunk(1000, function ($regions) {
            foreach ($regions as $region) {
                echo $region->code.' => '.$region->name.PHP_EOL;
            }
            //您可以通过从闭包中返回 false 来停止处理其余的块
            //return false;
        });

        #如果您打算在分块时更新检索到的记录,最好使用 chunkById 方法
        DB::connection('mysql2')->table('regions')->chunkById(100, function ($regions) {
            foreach ($regions as $region) {
//                echo $region->code.' => '.$region->name.PHP_EOL;
                DB::table('users')->where('id', $region->id)->update(['views' => 1]);
            }
        });

Lazily 流式传输结果

代码语言:javascript
复制
        DB::table('article')->orderBy('id')->lazy()->each(function ($article) {
            echo $article->title.PHP_EOL;
        });

        #如果您打算在迭代它们时更新检索到的记录,最好使用 lazyById 或 lazyByIdDesc 方法。
        DB::table('users')->where('active', false)->lazyById()->each(function ($user) {
            DB::table('users')
                ->where('id', $user->id)
                ->update(['active' => true]);
        });

聚合函数

代码语言:javascript
复制
        $users = DB::table('users')->count();
        $price = DB::table('orders')->max('price');
        $price = DB::table('orders')->where('finalized', 1)->avg('price');

判断记录是否存在

代码语言:javascript
复制
if (DB::table('orders')->where('finalized', 1)->exists()) {
    // ...
}

if (DB::table('orders')->where('finalized', 1)->doesntExist()) {
    // ...
}

Select 语句

代码语言:javascript
复制
        #筛选字段
        $users = DB::table('users')->select('name', 'email as user_email')->get();
        #去重
        $users = DB::table('users')->distinct()->get();

        #addSelect
        $query = DB::table('users')->select('name');
        $users = $query->addSelect('age')->get();

原生表达式

代码语言:javascript
复制
        $users = DB::table('users')
            ->select(DB::raw('count(*) as user_count, status'))
            ->where('status', '<>', 1)
            ->groupBy('status')
            ->get();
        #可以使用以下方法代替 DB::raw
        #selectRaw
        #whereRaw / orWhereRaw
        #havingRaw / orHavingRaw
        #orderByRaw
        #groupByRaw

Joins

代码语言:javascript
复制
        #Inner Join 语句
        $users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

        #Left Join / Right Join 语句
        $users = DB::table('users')
            ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();

        $users = DB::table('users')
            ->rightJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();

Where 语句

代码语言:javascript
复制
        $users = DB::table('users')
            ->where('votes', '=', 100)
            ->where('age', '>', 35)
            ->get();

        $users = DB::table('users')
            ->where('votes', '>=', 100)
            ->get();

        $users = DB::table('users')
            ->where('votes', '<>', 100)
            ->get();

        $users = DB::table('users')
            ->where('name', 'like', 'T%')
            ->get();

        $users = DB::table('users')->where([
            ['status', '=', '1'],
            ['subscribed', '<>', '1'],
        ])->get();

        #Or Where 语句
        $users = DB::table('users')
            ->where('votes', '>', 100)
            ->orWhere('name', 'John')
            ->get();

        #JSON Where 语句
        $users = DB::table('users')
            ->where('preferences->dining->meal', 'salad')
            ->get();

        #whereBetween / orWhereBetween
        $users = DB::table('users')
            ->whereBetween('votes', [1, 100])
            ->get();

        #whereNotBetween / orWhereNotBetween
        $users = DB::table('users')
            ->whereNotBetween('votes', [1, 100])
            ->get();

        #whereIn / whereNotIn / orWhereIn / orWhereNotIn
        $users = DB::table('users')
            ->whereIn('id', [1, 2, 3])
            ->get();
        $users = DB::table('users')
            ->whereNotIn('id', [1, 2, 3])
            ->get();

        #whereNull / whereNotNull / orWhereNull / orWhereNotNull
        $users = DB::table('users')
            ->whereNull('updated_at')
            ->get();
        $users = DB::table('users')
            ->whereNotNull('updated_at')
            ->get();

        #whereDate / whereMonth / whereDay / whereYear / whereTime
        $users = DB::table('users')
            ->whereDate('created_at', '2016-12-31')
            ->get();
        $users = DB::table('users')
            ->whereMonth('created_at', '12')
            ->get();
        $users = DB::table('users')
            ->whereDay('created_at', '31')
            ->get();
        $users = DB::table('users')
            ->whereYear('created_at', '2016')
            ->get();
        $users = DB::table('users')
            ->whereTime('created_at', '=', '11:20:45')
            ->get();

        #whereColumn / orWhereColumn
        $users = DB::table('users')
            ->whereColumn('first_name', 'last_name')
            ->get();
        $users = DB::table('users')
            ->whereColumn('updated_at', '>', 'created_at')
            ->get();
        $users = DB::table('users')
            ->whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at'],
            ])->get();

        #逻辑分组
        $users = DB::table('users')
            ->where('name', '=', 'John')
            ->where(function ($query) {
                $query->where('votes', '>', 100)
                    ->orWhere('title', '=', 'Admin');
            })
            ->get();

        #子查询 Where 语句
        $users = User::where(function ($query) {
            $query->select('type')
                ->from('membership')
                ->whereColumn('membership.user_id', 'users.id')
                ->orderByDesc('membership.start_date')
                ->limit(1);
        }, 'Pro')->get();

Ordering, Grouping, Limit & Offset

代码语言:javascript
复制
        #排序
        $users = DB::table('users')
            ->orderBy('name', 'desc')
            ->get();
        $users = DB::table('users')
            ->orderBy('name', 'desc')
            ->orderBy('email', 'asc')
            ->get();
        #latest 和 oldest 方法可以方便让你把结果根据日期排序。查询结果默认根据数据表的 created_at 字段进行排序 。或者,你可以传一个你想要排序的列名
        $user = DB::table('users')
            ->latest()
            ->first();

        #随机排序
        $randomUser = DB::table('users')
            ->inRandomOrder()
            ->first();

        #groupBy 和 having 方法
        $users = DB::table('users')
            ->groupBy('account_id')
            ->having('account_id', '>', 100)
            ->get();
        $report = DB::table('orders')
            ->selectRaw('count(id) as number_of_orders, customer_id')
            ->groupBy('customer_id')
            ->havingBetween('number_of_orders', [5, 15])
            ->get();
        $users = DB::table('users')
            ->groupBy('first_name', 'status')
            ->having('account_id', '>', 100)
            ->get();

        #Limit 和 Offset
        $users = DB::table('users')->skip(10)->take(5)->get();
        #或者,你可以使用 limit 和 offset 方法。这些方法在功能上等同于 take 和 skip 方法,如下:
        $users = DB::table('users')->offset(10)->limit(5)->get();

条件语句 when

代码语言:javascript
复制
        #when 方法只有当第一个参数为 true 的时候才执行给定的闭包
        $role=1;
        $users = DB::table('users')
            ->when($role, function ($query, $role) {
                return $query->where('role_id', $role);
            })
            ->get();

        #只有当第一个参数的计算结果为 false 时,这个闭包才会执行
        $sortByVotes = 0;
        $users = DB::table('users')
            ->when($sortByVotes, function ($query, $sortByVotes) {
                return $query->orderBy('votes');
            }, function ($query) {
                return $query->orderBy('name');
            })
            ->get();

插入语句

代码语言:javascript
复制
        DB::table('users')->insert([
            'email' => 'kayla@example.com',
            'votes' => 0
        ]);
        DB::table('users')->insert([
            ['email' => 'picard@example.com', 'votes' => 0],
            ['email' => 'janeway@example.com', 'votes' => 0],
        ]);
        #自增 IDs
        $id = DB::table('users')->insertGetId(
            ['email' => 'john@example.com', 'votes' => 0]
        );

Update 语句

代码语言:javascript
复制
        $affected = DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);
        DB::table('users')
            ->updateOrInsert(
                ['email' => 'john@example.com', 'name' => 'John'],
                ['votes' => '2']
            );
        #更新 JSON 字段
        $affected = DB::table('users')
            ->where('id', 1)
            ->update(['options->enabled' => true]);

        #自增与自减
        DB::table('users')->increment('votes');
        DB::table('users')->increment('votes', 5);
        DB::table('users')->decrement('votes');
        DB::table('users')->decrement('votes', 5);

删除语句

代码语言:javascript
复制
        $deleted = DB::table('users')->where('votes', '>', 100)->delete();

悲观锁

代码语言:javascript
复制
        DB::table('users')
            ->where('votes', '>', 100)
            ->sharedLock()
            ->get();
        DB::table('users')
            ->where('votes', '>', 100)
            ->lockForUpdate()
            ->get();

调试

代码语言:javascript
复制
DB::table('users')->where('votes', '>', 100)->dd();

DB::table('users')->where('votes', '>', 100)->dump();

参考

https://learnku.com/docs/laravel/9.x/queries/12246

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取结果
  • Select 语句
  • 原生表达式
  • Joins
  • Where 语句
  • Ordering, Grouping, Limit & Offset
  • 条件语句 when
  • 插入语句
  • Update 语句
  • 删除语句
  • 悲观锁
  • 调试
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档