将 SQL 查询转换为 joomla 的 codeigniter

Posted

技术标签:

【中文标题】将 SQL 查询转换为 joomla 的 codeigniter【英文标题】:Translate SQL query into codeigniter for joomla 【发布时间】:2021-09-24 12:35:15 【问题描述】:

我编写了一个运行良好的 SQL 查询,输出提供了我需要的所有数据:

请看这个截图:

这是 SQL 代码:

SELECT 
    P.name, C.project_id, C.choice_id, C.time_stamp, P.id, 
    P.description, T.type, P.activated
FROM
    (SELECT P.*
     FROM aqoru_pt_project P
     JOIN
         (SELECT id, MAX(creation_date) AS latestUpdate
          FROM aqoru_pt_project
          GROUP BY id) t ON t.id = P.id AND t.latestUpdate = P.creation_date) P
JOIN
    (SELECT C.*
     FROM aqoru_pt_project_choice C
     JOIN
         (SELECT project_id, MAX(time_stamp) AS latestDate
          FROM aqoru_pt_project_choice
          GROUP BY project_id) t ON t.project_id = C.project_id AND t.latestDate = C.time_stamp) C ON P.id = C.project_id
LEFT JOIN 
    aqoru_community_groups_members CGM ON P.group_id = CGM.groupid
INNER JOIN
    aqoru_pt_project_type T ON P.type_id = T.id
WHERE
    P.user_id = 569 OR CGM.memberid = 569
    AND CGM.permissions = 1
    AND P.deactivated != 1
GROUP BY 
    P.id
ORDER BY 
    P.id;

现在我需要将它推送到我尝试过但没有取得巨大成功的 php 格式,因为我主要在代码开头尝试将 Join 放入 select 的部分苦苦挣扎。 ON P.id = C.project_id 之后的部分绝对可以正常工作。当我尝试从其他表中添加最大值时会出现问题。

这是我写的代码,但是不行:

public function getProjects($userID)
    
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        $columns = array('P.id', 'P.name', 'P.description', 'T.type', 'P.activated');
        $query
            ->select(array('P.id', 'P.name', 'P.description', 'T.type', 'P.activated', 'max(C.time_stamp) as max'))
            ->from($db->quoteName(
                ->SELECT ('P.*')
                ->FROM ($db->quoteName('aqoru_pt_project', 'P')
                ->JOIN($db->quoteName(
                    ->SELECT ('id', 'MAX(creation_date) AS latestUpdate')
                    ->FROM ($db->quoteName('aqoru_pt_project')
                    ->group($db->quoteName('id')) 't' .  ' ON t.id = P.id AND t.latestUpdate = P.creation_date') P
                ->JOIN(
                  ->SELECT ('C.*')
                  ->FROM ($db->quoteName('aqoru_pt_project_choice', 'C')
                    ->JOIN($db->quoteName(
                    ->SELECT ('project_id', 'MAX(time_stamp) AS latestDate')
                    ->FROM ($db->quoteName('aqoru_pt_project_choice'))
                    ->group($db->quoteName('id')) 't' .  ' ON t.project_id = P.project_id AND t.latestUpdate = P.time_stamp') 'C' . 'ON P.id = C.project_id'

            ))
            ->leftjoin($db->quoteName('#__community_groups_members', 'CGM') . ' ON P.group_id = CGM.groupid')
            ->innerjoin($db->quoteName('#__pt_project_type', 'T') . ' ON P.type_id = T.id')
            ->where(
                $db->quoteName('P.user_id') . ' = ' . $db->quote($userID),
            )
            ->orwhere(array(
                $db->quoteName('CGM.memberid') . ' = ' . $db->quote($userID),
                $db->quoteName('CGM.permissions') . ' = 1'
            ))
            ->andwhere($db->quoteName('P.deactivated') . ' != 1')
            ->group($db->quoteName('P.id'))
            ->order('P.id DESC');
        /*
         * Note: for some reason the queries return duplicates on the production site not on my local site
         * So we must group by projectID to avoid duplicates. I am not aware what is causing this duplication
         */

        return $db->setQuery($query)->loadObjectList();
    

【问题讨论】:

如果您可以转储 getProjects() 生成的 SQL 查询,您可以将其与您的经典 sql 查询进行比较。我不熟悉 Joomla,但在 Codeigniter 中你可以使用 $this->db->last_query() Joomla 有自己的查询构建方法,所以我建议使用它而不是 CI 的活动记录(作为代码核心和自定义代码之间的一致性问题)。请在Joomla Stack Exchange 上发布您的 Joomla 问题,以引起对 CMS 及其扩展有深入了解的专业人士的注意。如果您在询问之前搜索 JSE,您会发现许多页面展示了如何 dump() 进行查询(其中有几个是我发布的)。我认为您需要提前声明一个子查询。 joomla.stackexchange.com/search?q=user%3A12352+%24subquery 谢谢大家。我很抱歉在发布之前没有进行搜索。 【参考方案1】:

试试这个

$this->db->select('P.name,C.project_id,C.choice_id,C.time_stamp,P.id,P.description,T.type,P.activated')
->from('(SELECT P.*
     FROM aqoru_pt_project P
     JOIN
         (SELECT id, MAX(creation_date) AS latestUpdate
          FROM aqoru_pt_project
          GROUP BY id) t ON t.id = P.id AND t.latestUpdate = P.creation_date) P')
->join('(SELECT C.*
     FROM aqoru_pt_project_choice C
     JOIN
         (SELECT project_id, MAX(time_stamp) AS latestDate
          FROM aqoru_pt_project_choice
          GROUP BY project_id) t ON t.project_id = C.project_id AND t.latestDate = C.time_stamp) C', 'P.id = C.project_id')
->join('aqoru_community_groups_members CGM', 'P.group_id = CGM.groupid', 'LEFT')
->join('aqoru_pt_project_type T', 'P.type_id = T.id')
->where('P.user_id', 569)
->or_where('CGM.memberid', 569)
->where('CGM.permissions', 1)
->where('P.deactivated !=', 1)
->group_by('P.id')
->order_by('P.id ASC')
->get();

【讨论】:

以上是关于将 SQL 查询转换为 joomla 的 codeigniter的主要内容,如果未能解决你的问题,请参考以下文章

如何将sql中的查询转换为rails中的查询

SQL语句为joomla文章数据库基于另一个字段创建一个字段

joomla上标签计数的SQL查询

将 Joomla 2.5 模板转换为 3.0

将 PHP 网站转换为 Joomla

将 Joomla 模块转换为在现有组件中查看