4

刚开始,这应该是一个简单的,但我一直无法找到一个好的来源,尤其是从 1.5 到 1.6/1.7/2.5 的转换。

构建组件和其他问题不断遇到语法问题。

例如,这是我构建查询的一种方式: [TYPE 1]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ');
$query->FROM (' #__users AS u');
$query->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ');
$query->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ');
$query->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');

另一种方式: [TYPE 2]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ')
->FROM (' #__users AS u')
->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ')
->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ')
->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');

令人困惑的是,像“LEFTJOIN”这样的mysql调用是一个词而不是两个词。所以,如果我想使用INSERT…ON DUPLICATE KEY UPDATE我完全迷失了。

这是第三个: [TYPE 3]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ');
$query->FROM (' #__users AS u');
$query->JOIN ('LEFT', ' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ');
$query->JOIN ('LEFT', ' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ');
$query->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');
$query->ORDER ('u.name ASC');

这是我看到查询已构建但无法开始工作的另一种方式 [已编辑- 现在正在工作,谢谢@cppl!] [类型 4]

$query= "SELECT `u`.`id` as UserID
    , `u`.`name` AS Name
    , `uppi`.`profile_value` AS Hair
    , `uppi2`.`profile_value` AS Height
FROM `#__users` AS u
LEFT JOIN `#__user_profiles` AS uppi ON `u`.`id` = `uppi`.`user_id` AND `uppi`.`ordering` = 1 
LEFT JOIN `#__user_profiles` AS uppi2 ON `u`.`id` = `uppi2`.`user_id` AND `uppi2`.`ordering` = 2
    ";

我已经阅读了 Joomla MVC 教程和 Lynda ......除了“这里有一些代码 - PLOP”之外,没有一个人真正解决了这个问题。

References:
    --//www.theartofjoomla.com/home/9-developer/135-database-upgrades-in-joomla-16.html
    --//stackoverflow.com/questions/8467858/joomla-1-7-db-query-does-not-work-when-query-has-an-ampersand
    --developer.joomla.org/standards/ch03s10.html
    --forum.joomla.org/viewtopic.php?p=2506722
    --forum.joomla.org/viewtopic.php?p=1200668
    --docs.joomla.org/API16:JDatabaseQuery
    --//fsadventures.com/2011/01/some-basic-joomla-database-call-functions/
    --//www.sourcecodester.com/php/3863/updating-multiple-rows-mysql-using-php.html
    --//stackoverflow.com/questions/7047471/mysql-query-syntax-error

问题:

1)这些之间有什么区别吗?

2)有理由使用一种方法而不是另一种方法吗?

3) 有没有很好的资源来学习不同的构建方式?我已经搜索了几个小时,但没有找到任何全面的东西。

谢谢!

4

1 回答 1

2
  1. 您的类型 1,2 和 3 使用较新的 JDatabaseQuery 对象,而类型 4 使用较旧的样式将查询设置为 SQL 字符串。
  2. 如果类型 4不起作用,您会收到 SQL 错误吗?(您是否打开了 Joomla 的调试模式,以便可以通过应用程序配置文件转储 SQL 错误?)
  3. JDatabaseQuery 用于提供支持多个 SQL 数据库而不仅仅是 mySQL 所需的抽象,这就是为什么$query对象具有类似、、、等功能select()where()原因join()......
  4. 请记住,这->leftJoin()是对 JDatabaseQuery 函数的 PHP 调用leftJoin(),因此必须是一个单词,即。不可能是两个。
  5. leftJoin()实际上只是调用join('LEFT',$conditions)所以它是一个可读性实现而不是功能差异。
  6. 因此,类型 1,2 和 3 实际上是相同的,它们只是具有不同程度的可读性(例如,恕我直言,类型 2 和 3 比类型 1 更难阅读和维护)。

您似乎已经找到了 Joomla 的所有在线资源!文档,除了 Joomla! Google Groups(CMS 开发通用开发平台开发)。

唯一的其他来源是 Andrew Eddies“学习 Joomla 的艺术! ”。我自己没有使用过 Andrew 的东西,但我在最后一个 Joomla 中听到了很多关于它的好消息!我参加的那天。

编辑 基于错误我会说这是因为您将标识符u.id封装为一个标识符。尝试类似:

SELECT `u`.`id` AS "UserID" FROM `#__users` AS `u`
于 2012-03-26T01:48:56.243 回答