首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连接两张桌子?

如何连接两张桌子?
EN

Drupal用户
提问于 2021-01-25 15:47:55
回答 2查看 1.1K关注 0票数 -1

我一直在关注本教程的Drupal模块开发。讨论了模块开发中的数据库查询连接。本教程是为Drupal 8编写的,我正在使用Drupal 9。

然后我做了这个(看看联接部分):

代码语言:javascript
复制
  protected function load () {
    $select = Database::getConnection()->select('rsvplist', 'r');
    $select.join('users_field_data', 'u', 'r.uid = u.uid');
    $select->join('node_field_data', 'n', 'r.nid = n.nid');
    $select->addField('u', 'name');
    $select->addField('n', 'title');
    $select->addField('r', 'mail');
    $entries = $select->execute()->fetchAll(\PDO::FETCH_ASSOC);
    return $entries;
  }

但是得到这个错误:

代码语言:javascript
复制
warning: join() expects at most 2 parameters, 3 given in Drupal\rsvplist\Controller\ReportController->load() (line 24 of /var/www/htdocs/drupal-modules/modules/custom/rsvplist/src/Controller/ReportController.php)
#0 /var/www/htdocs/drupal-modules/core/includes/bootstrap.inc(305): _drupal_error_handler_real(2, 'join() expects ...', '/var/www/htdocs...', 24)
#1 [internal function]: _drupal_error_handler(2, 'join() expects ...', '/var/www/htdocs...', 24, Array)
#2 /var/www/htdocs/drupal-modules/modules/custom/rsvplist/src/Controller/ReportController.php(24): join('users_field_dat...', 'u', 'r.uid = u.uid')
#3 /var/www/htdocs/drupal-modules/modules/custom/rsvplist/src/Controller/ReportController.php(52): Drupal\rsvplist\Controller\ReportController->load()
#4 [internal function]: Drupal\rsvplist\Controller\ReportController->report()
#5 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#6 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/Render/Renderer.php(573): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#7 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#8 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
#9 /var/www/htdocs/drupal-modules/vendor/symfony/http-kernel/HttpKernel.php(158): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#10 /var/www/htdocs/drupal-modules/vendor/symfony/http-kernel/HttpKernel.php(80): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#11 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#12 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#13 /var/www/htdocs/drupal-modules/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /var/www/htdocs/drupal-modules/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#15 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#16 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#17 /var/www/htdocs/drupal-modules/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#18 /var/www/htdocs/drupal-modules/core/lib/Drupal/Core/DrupalKernel.php(706): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#19 /var/www/htdocs/drupal-modules/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#20 {main}

Drupal 9's加入不接受第三种说法:

代码语言:javascript
复制
'r.uid = u.uid'

A进行了一些研究,但我未能找到一个类似的例子,说明如何在Drupap 9文档和其他来源中以这种方式使用join。

如何将联接添加到Drupal 9中的查询中?

EN

回答 2

Drupal用户

发布于 2021-01-25 16:46:01

在PHP中:

  • .是字符串连接操作符,而不是调用对象方法的操作符。
  • join()implode()函数的别名,它实际上需要2个参数,而不是3个

这意味着$select.join('users_field_data', 'u', 'r.uid = u.uid') ( PHP读取为$select . join('users_field_data', 'u', 'r.uid = u.uid'))是:

  • $select中包含的值转换为字符串
  • 将该字符串与implode()返回的字符串进行连接

implode()接受的参数在最新的PHP版本中已经更改,但是函数从未接受过三个参数,前两个参数从未是两个字符串。

这就解释了你所犯的错误。

在Drupal 9中,如果$select是实现SelectInterface的对象,则$select->join()是可用的方法。

代码语言:javascript
复制
public function join($table, $alias = NULL, $condition = NULL, $arguments = []) {
  return $this->addJoin('INNER', $table, $alias, $condition, $arguments);
}

而不是$select->join(),您可以调用$select->addJoin()。第一个方法不需要指定$select->addJoin()的第一个或最后一个参数,它是通常被调用的方法。

另外,与其在用于实体数据的数据库表上使用$select,不如使用从Drupal::entityQuery()返回的类。

票数 2
EN

Drupal用户

发布于 2021-01-25 16:09:39

解决方案:

在Drupal 9中,我需要替换joins以使其工作:

代码语言:javascript
复制
//$select.join('users_field_data', 'u', 'r.uid = u.uid');
$select->addJoin('inner','users_field_data','u','r.uid = u.uid');
//$select->join('node_field_data', 'n', 'r.nid = n.nid');
$select->addJoin('inner','node_field_data','n','r.nid = n.nid');
票数 0
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/299700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档