如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?

Posted

技术标签:

【中文标题】如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?【英文标题】:How to convert left join lateral SQL query to Laravel Eloquent query? 【发布时间】:2021-08-10 10:38:48 【问题描述】:

我想在 Eloquent 查询中转换以下 Postgre SQL 查询:

SELECT ncts_info.nct_id, A.agency_model, ncts_info.indexation_id
FROM ncts_info
LEFT JOIN (
    drug_centers LEFT JOIN LATERAL json_to_recordset(nct_numbers) AS tbl(nct_number text) ON true
) A ON A.nct_number = ncts_info.nct_id

如何将其转换为 Eloquent 查询?

【问题讨论】:

【参考方案1】:

我设法以某种方式部分获得了正确的 Laravel 查询,但缺少一些东西:

NctsInfo::leftJoin('drug_centers', function($join) 
   $join->leftJoin(DB::raw('LATERAL json_to_recordset(nct_numbers) AS tbl(nct_number text)'), DB::raw('1'), '=', DB::raw('1'));
   $join->on(DB::raw('dc.nct_number'), '=' ,DB::raw('ncts_info.nct_id'));
)
->whereNotNull("nct_numbers")->get();

但根据我预期的 sql 查询:

SELECT ncts_info.nct_id, A.agency_model, ncts_info.indexation_id FROM ncts_info
LEFT JOIN (
    drug_centers LEFT JOIN LATERAL json_to_recordset(nct_numbers) AS tbl(nct_number text) ON true
) A ON A.nct_number = ncts_info.nct_id

我需要将我的第一个左连接“别名”为“A”以获取我的 nct_number 字段。

有人知道怎么解决吗?

感谢您的帮助

【讨论】:

【参考方案2】:

我发现最好的方法是先定义一个子查询。来自 laravel 文档:

Posts = DB::table('posts')
->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
               ->where('is_published', true)
               ->groupBy('user_id');

$users = DB::table('users')
    ->joinLeftSub($latestPosts, 'latest_posts', function ($join) 
        $join->on('users.id', '=', 'latest_posts.user_id');
    )->get();

【讨论】:

【参考方案3】:

你可以像在 laravel 中那样使用 DB

$data = DB::table('ncts_info')
->leftJoin('drug_centers', 'drug_centers.foreign_key', 'ncts_info.id')
->select('ncts_info.nct_id','A.agency_model','ncts_info.indexation_id')
->get();

这将产生以下查询:

SELECT "ncts_info"."nct_id", "A"."agency_model", "ncts_info"."indexation_id"
FROM "ncts_info"
LEFT JOIN "drug_centers" ON "drug_centers"."foreign_key" = "ncts_info"."id";

【讨论】:

这没有回答问题。它不会产生 OP 想要的相同查询。 不幸的是,这对我没有帮助。我需要包含 LATERAL 子句:/

以上是关于如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何将在左连接中具有连接的 sql 转换为查询构建器?

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

SQL 将横向数据转为纵向记录

如何在不破坏SQL逻辑的情况下将JOINS转换为子查询

将带有连接的 SQL 查询转换为 lambda 表达式

sql纵向数据变横向数据正负