Laravel query builder 使用子查询

需求1:

SELECT COUNT(*) FROM 
 (SELECT * FROM abc GROUP BY col1) AS a;

执行代码

$sub = Abc::where(..)->groupBy(..); // Eloquent Builder instance

$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
    ->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
    ->count();

需求2: 执行如下代码

SELECT 
    `p`.`id`,
    `p`.`name`, 
    `p`.`img`, 
    `p`.`safe_name`, 
    `p`.`sku`, 
    `p`.`productstatusid` 
FROM `products` p 
WHERE `p`.`id` IN (
    SELECT 
        `product_id` 
    FROM `product_category`
    WHERE `category_id` IN ('223', '15')
)
AND `p`.`active`=1

实现:

Products::whereIn('id', function($query){
    $query->select('paper_type_id')
    ->from(with(new ProductCategory)->getTable())
    ->whereIn('category_id', ['223', '15'])
    ->where('active', 1);
})->get();

综合运用:

$query = \DB::table('message')
    ->where(function ($query) use ($userId) {
        $query->where([
            ['receiver_id', '=', "$userId"],
            ['type', '=', Messages::PRIVATE_MESSAGE],
        ]);
    });
if (!empty($groupIds)) {
    $query->orWhere(function ($queryq) use ($groupIds) {
        $queryq
            ->where([
                ['type', '=', Messages::GROUP_MESSAGE],
                ['message.created_at', '>', \Auth::user()->created_at]
            ])
            ->whereIn('receiver_id', $groupIds);
    });
}
/* 获取广播 */
$query->orWhere(function ($query) {
    $query
        ->where([
            ['type', '=', Messages::BROADCAST_MESSAGE],
            ['dead_line', '>', Carbon::createFromTimestamp(time())],
            ['message.created_at', '>', \Auth::user()->created_at]
        ]);
});
$query->leftJoin('message_log', function ($join) use ($userId) {
    $join->on('message.id', '=', 'message_log.message_id')
        ->where('message_log.user_id', '=', $userId);
})

    ->leftJoin('subscribe', function ($join)  use ($userId) {
        $join->on('subscribe.pcode_id', '=', 'message.receiver_id')
            ->where('subscribe.user_id', '=', $userId);
    })

    ->select([
        'message_log.id as message_log_id',
        'message.id as message_id',
        'message.content',
        'message.type',
        'message.sender_id',
        'message.updated_at',
        'message.created_at',
        'message.dead_line',
        \DB::raw('IF (message.`created_at` < subscribe.`created_at` , 1, 0) AS is_expired')
    ]);

$resQuery = \DB::table(\DB::raw("({$query->toSql()}) as sub"))
    ->mergeBindings($query)
    ->where('is_expired', '=', 0);

帝国金的菜园子
分享一些工作学习中的经验
188 声望
3 粉丝
0 条评论
推荐阅读
win10 docker laradock 搭建PHP“简易”开发环境
安装windows版本docker,并且安装,这里我选择使用hyperV【官网】:[链接]下载laradock【github】:[链接] {代码...} 进入laradock文件夹复制.env.example到.env打开.env,按需进行一些调整,比如: {代码...} 按...

小金子阅读 605

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

Goravel ORM 新增模型关联,用 Golang 写关联也可以跟 Laravel 简单
Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang!

韩同学的简单逻辑阅读 737

laravel 文档摘要2
数据库对于数据的保存数据库第一二三范式到底在说什么[链接]数据库的操作独立于 query builder 和 ORM 的存在ORM 的操作是在操作内存对象 是独立的ORM 的一个对象自带了操作 relationship 的方法query builder 的...

changsj阅读 710

Python连接es笔记二之查询方式汇总
本文首发于公众号:Hunter后端原文链接:Python连接es笔记二之查询方式汇总上一节除了介绍使用 Python 连接 es,还有最简单的 query() 方法,这一节介绍一下几种其他的查询方式。以下是本篇笔记目录:query() 方...

Hunter阅读 703

封面图
laravel 文档摘要
$request-&gt;input('date') 可以是 "2021-01-05 01:00:00" 字符串,通过 Carbon::parse($request-&gt;input('date') ?? now_local()),它可以被转化为 CarbonInterface::DateTimeInterface

changsj阅读 699

【第五篇Laravel10权限中间件】Laravel10 + Vue3.0前后端分离框架通用后台源码
②复制Laravel9 + Vue3.0前后端分离框架通用后台源码,backend/app/Http/Kernel.php 搜索 $routeMiddleware

小拼拼阅读 563

188 声望
3 粉丝
宣传栏