首页 > 解决方案 > 自定义子查询不起作用并给出错误

问题描述

我正在开发一个旧的 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();

在此处输入图像描述

标签: phpmysqllaravel

解决方案


我转换您的 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();
    })

推荐阅读