php - 自定义子查询不起作用并给出错误
问题描述
我正在开发一个旧的 php 项目并在 Laravel 8 中更新它。我试图在 Laravel 查询中翻译一段旧的 sql 查询,但我收到一个错误,我不知道如何解决它。我希望你能帮助我。
旧代码:
$row = $userdb->q("
SELECT ci.id, ci.id_category, ci.subject, cit.name AS catname
FROM contactinfo ci
LEFT JOIN contactinfo_notes cin ON (cin.id=(SELECT id FROM contactinfo_notes cin2 WHERE cin2.id_ci=ci.id AND cin2.deleted=0 ORDER BY cin2.id DESC LIMIT 1))
LEFT JOIN contactinfo_types cit ON (cit.id=ci.id_category);
新代码:
$collection = DB::table('contactinfo AS ci')
->select(
'ci.id',
'ci.id_category',
'ci.subject',
'cit.name AS catName'
)
->leftJoin('contactinfo_notes AS cin', function ($query) {
$query->select('cin2.id')
->from('contactinfo_notes AS cin2')
->where('cin2.id_ci', '=', 'ci.id')
->where('cin2.deleted', 0)
->orderBy('cin2.id', 'desc')
->limit(1);
}, '=', 'cin.id')
->leftJoin('contactinfo_types AS cit', 'ci.id_category', 'cit.id')
->get();
解决方案
我转换您的 sql 代码,为第一个 leftjoin 添加 DB Raw。
$collection = DB::table('contactinfo as ci')
->select('ci.id','ci.id_category','ci.subject','cit.name AS catname')
->leftJoin('contactinfo_notes cin', 'cin.id','=',DB::Raw('SELECT id FROM contactinfo_notes cin2 WHERE cin2.id_ci=ci.id AND cin2.deleted=0 ORDER BY cin2.id DESC LIMIT 1')
->leftJoin('contactinfo_types cit', 'cit.id','=','ci.id_category')->get();
或者你可以用这个代码替换第一个leftjoin,女巫更具可读性。
->leftJoin('contactinfo_notes cin2', function($join)
{
$join->on('cin2.id_ci', '=', 'ci.id')
->where('cin2.deleted', 0)
->orderBy('cin2.id', 'DESC')
->take(1)->get();
})
推荐阅读
- javascript - React - getDerivedStateFromProps 和 axios
- hyperledger-fabric - 是否可以从 Fabric 客户端节点安装和使用 Hyperledger Explorer?
- python - 谷歌文档格式化,将文本转换成表格
- asp.net-core - 在 Dotnet Core 中获取针对 Google 身份验证的其他用户声明
- jquery - 无法使用 Response.Write 或 ClientScript.RegisterStartupScript 从代码后面打开新窗口
- asp.net - 在注册页面 ASP.NET Core 3.1 Identity 上填充下拉列表
- mysql - 子查询返回超过 1 行
- c# - 反序列化数组 json 的数组
- go - 如何在你的 go 文件中包含下载的 go 包
- python - 如何写入文件并每两条记录留一个空行?