Как использовать Join в BD Query Laravel, используя две разные базы данных? - PullRequest
0 голосов
/ 07 марта 2020

Я получил этот фрагмент кода ниже, чтобы показать таблицу на странице, но она не работает. Я получил эту ошибку, где говорится, что команда была отклонена.

$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' для таблицы «пользователи» (SQL: выберите количество (*) в качестве совокупности из wp_rocketsciencebrposts внутреннего объединения mysql. users в users. rsbwordpressid = mysql2. wp_rocketsciencebrposts. post_author где post_status in (publi sh, private) и post_type = post)

Обе базы данных находятся на одном сервере.

Таблица "wp_rocketsciencebrposts" взята из "lovel095_rocketsciencebr" база данных.
Таблица "users" взята из "lovel095_centralrsb" database.

В моем файле .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)

В моем файле конфигурации> базы данных. 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'),
],

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Здравствуйте. Я не уверен, что вам нужно настроить 2 базы данных для выполнения такого запроса. Просто убедитесь, что учетные данные, которые вы используете для подключения к одной базе данных, могут получить доступ к обеим, это работает с MySql.

Здесь я предлагаю вам прочитать , что другой ответ stackoverflow

В основном вам нужно добавить префикс таблиц к имени базы данных, чтобы объединение работало. Я предлагаю вам сначала попробовать это из PhpMyAdmin, а затем перевести на Laravel Query Builder.

Помните, что вы можете использовать целые необработанные запросы в построителе запросов, например:

DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = '$someVariable'") );
0 голосов
/ 07 марта 2020

Большая часть базы данных не поддерживает перекрестное объединение баз данных, я считаю, SQL сервер поддерживает это, но оно должно быть на том же сервере. Вместо того, чтобы заставлять ваше приложение объединять две разные базы данных, просто используйте базу данных отдельно.

В вашем случае, просто сначала выберите сообщения, затем выберите имя пользователя с помощью 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...