【问题标题】:Different ways of building a query in Joomla?在 Joomla 中构建查询的不同方法?
【发布时间】:2012-04-09 13:19:51
【问题描述】:

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

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

例如,这是我构建查询的一种方式: [类型 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
    ');

另一种方式: [类型 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 我完全迷路了。

这是第三个: [类型 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) 有没有很好的资源可以学习不同的构建方法?我已经搜索了几个小时,但没有找到任何全面的内容。

谢谢!

【问题讨论】:

  • 不知道 Joomla 但总的来说我尽量不要使用ON DUPLICATE KEY UPDATE。我更喜欢尝试查询并生成异常/错误,然后使用第二个查询对该错误采取行动。我使用了很多不同的 ORM 和 DBAL 层,但它们都没有从他们的 API 中支持该功能,您通常必须恢复到他们必须使用的任何原始 SQL 工具来完成它。
  • 啊,好点子!我现在正在做的事情永远不会在其他任何地方使用,但这绝对是我在学习时会保留的东西。谢谢!

标签: php mysql joomla joomla1.6 joomla2.5


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

您似乎已经找到了 Joomla 的所有在线资源!文档,除了 Joomla! Google 网上论坛(CMS DevGeneral DevPlatform Dev)。

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

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

SELECT `u`.`id` AS "UserID" FROM `#__users` AS `u`

【讨论】:

  • 关于 2) - 调试器说“JDatabaseMySQLi::query: 1054 - '字段列表'中的未知列 'u.id'”。我可能没有正确的 `` 或 '' - 我看到了一些不同的变化,但不确定什么是正确的。但如果那已经过时了,我什至不会担心。
  • 太棒了 - 成功了!我什至认为这行不通,那些小东西完全把我绊倒了。谢谢你两次!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2017-04-10
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多