php - 如何使用两个不同的数据库在 BD Query Laravel 中使用 Join?
问题描述
我得到了下面这段代码来显示页面中的表格,但它不起作用。我收到此错误,表明该命令被拒绝。
$posts = DB::connection('mysql2')
->table('wp_rocketsciencebrposts')
->join('users', 'users.rsbwordpressid', '=', 'wp_rocketsciencebrposts.post_author')
->select('ID', 'post_title', 'post_status', 'post_author', 'post_date', 'users.name')
->whereIn('post_status', ['publish', 'private'])
->where('post_type', 'post')
->orderBy('id', 'desc')
->paginate(15, ['*'], 'posts');
SQLSTATE [42000]:语法错误或访问冲突:1142 SELECT 命令拒绝用户 'lovel095_heaven'@'177.134.6.23' 用于表 'users'(SQL:从
wp_rocketsciencebrposts
内部连接中选择计数(* ) 作为聚合mysql
。在哪里 (发布,私人)和=发布)users
users
rsbwordpressid
mysql2
wp_rocketsciencebrposts
post_author
post_status
post_type
两个数据库都在同一台服务器上。
表“wp_rocketsciencebrposts”来自“lovel095_rocketsciencebr”数据库。
表“users”来自“lovel095_centralrsb”数据库。
在我的 .env 文件中,我 git 这个:
DB_CONNECTION=mysql
DB_HOST=br862.hostgator.com.br
DB_PORT=3306
DB_DATABASE=lovel095_centralrsb
DB_USERNAME=(myusername)
DB_PASSWORD=(mypassword)
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=br862.hostgator.com.br
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=lovel095_rocketsciencebr
DB_USERNAME_SECOND=(myusername)
DB_PASSWORD_SECOND=(mypassword)
在我的 config>database.php 文件中,我得到了这个:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'mysql2' => [
'driver' => env('DB_CONNECTION_SECOND'),
'host' => env('DB_HOST_SECOND'),
'port' => env('DB_PORT_SECOND'),
'database' => env('DB_DATABASE_SECOND'),
'username' => env('DB_USERNAME_SECOND'),
'password' => env('DB_PASSWORD_SECOND'),
],
请帮忙!
解决方案
大多数数据库不支持跨数据库连接,我相信 SQL server 支持它但它必须在同一台服务器上。无需强制您的应用程序加入两个不同的数据库,只需单独使用数据库即可。
在您的情况下,只需先选择帖子,然后使用 foreach 选择用户名。这是解决方法:
$posts = DB::connection('mysql2')
->table('wp_rocketsciencebrposts')
->select('ID', 'post_title', 'post_status', 'post_author', 'post_date')
->whereIn('post_status', ['publish', 'private'])
->where('post_type', 'post')
->orderBy('id', 'desc')
->paginate(15, ['*'], 'posts');
foreach ($posts as $key => $post){
$user = DB::connection('mysql')
->table('lovel095_centralrsb')
->where('id', $post->post_author)
->first();
$posts[$key]->post_author_name = $user->name;
}
推荐阅读
- gnuplot - 如何正确地将透视图添加到代表分子的 Gnuplot 3D 连接点云?
- c# - 哈希集
包含重复项 - django - 如何使用 forms.ModeForm 呈现 CheckboxSelectMultiple 表单,该表单使用 DB 中的数据作为:-> SomeModel.objects.filter(user=request.user)
- spring-boot - Spring Boot:无法从 application.properties 获取 project.version
- python-3.x - 将json包装成方便的python模型类
- go - 如何从golang中的字段类型内部访问结构标签
- reactjs - React Native 页面导航
- c# - 将配置的选项实例注入范围服务的最佳方法是什么?
- sql - 在雪花环境中给出开始和结束日期时如何创建时间序列?
- azure-powershell - 用于导出具有容器/blob 公共访问级别的所有订阅中的所有存储帐户的 Powershell 脚本