【问题标题】:How to use Join in BD Query Laravel using two different databases?如何使用两个不同的数据库在 DB Query Laravel 中使用 Join?
【发布时间】:2020-03-07 14:47:29
【问题描述】:

我得到下面这段代码来在页面中显示一个表格,但它不起作用。我收到此错误,表明该命令被拒绝。

$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: select count(*) as aggregate from wp_rocketsciencebrposts 内部连接mysql.users on users.rsbwordpressid = mysql2.wp_rocketsciencebrposts.post_author 其中post_status 在(发布,私人)和post_type = 发布)

两个数据库位于同一台服务器上。

"wp_rocketsciencebrposts" 来自 "lovel095_rocketsciencebr" 数据库。
"users" 表来自 "lovel095_centralrsb" 数据库。

在我的 .env 文件中,我输入了这个:

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'),
],

请帮忙!

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    大多数数据库不支持跨数据库连接,我相信 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;
    }
    

    【讨论】:

    • 是的,数据库在同一台服务器上。我已经实现了您的解决方案,但它产生了另一个问题,foreach 循环中的数据库查询使我的页面变慢,因为它确实一次发出 15 个数据库请求。我的解决方法是实现一个连接,但正如你所看到的,我也遇到了问题。
    • 你使用什么数据库?
    • 我正在使用 MySQL 和 PhpMyAdmin。
    • 你可以试试这个解决方案stackoverflow.com/questions/5698378/…
    • 如果 eloquent 有点复杂,可以随时使用查询生成器
    【解决方案2】:

    您好,我不确定您是否需要配置 2 个数据库来执行此类查询。 只需确保您用于连接到一个数据库的凭据能够同时访问这两个数据库,它适用于 MySql。

    从这里我建议你阅读that other stackoverflow answer

    基本上,您需要在表前面加上数据库名称才能使连接起作用。 我建议你先从 PhpMyAdmin 试试这个,然后翻译成 Laravel Query Builder。

    请记住,您可以在查询构建器中使用整个原始查询,例如:

    DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = '$someVariable'") );
    

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2021-07-09
      • 2021-07-02
      • 2023-04-05
      • 2018-07-04
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多