如何使用 Laravel Eloquent 在不同服务器上的多个数据库之间执行连接查询?

Posted

技术标签:

【中文标题】如何使用 Laravel Eloquent 在不同服务器上的多个数据库之间执行连接查询?【英文标题】:How to execute Join queries between multiple Databases that are on different server with Laravel Eloquent? 【发布时间】:2015-07-26 23:50:47 【问题描述】:

这就是我们使用 Laravel 处理多个数据库连接的方式,它是一个 PHP 框架 而不是 Python(谁认为这是重复的帖子)

<?php
return array(

    'default' => 'mysql',

    'connections' => array(

        # Our primary database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'host1',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Our secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => 'host2',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

这就是你连接到这个数据库的方式。

$user1 = User::on('mysql1')->where(/* ... */)->get()
$user2 = User::on('mysql2')->where(/* ... */)->get()

这些只是 SELECT 查询。因此,Eloquent 可以完美运行。

但是,当我想在这两个数据库之间执行 JOIN 查询 操作时,这似乎是不可能的。

【问题讨论】:

你基本上不能(可能使用 FEDERATED 存储引擎,但我不能保证) MySQL -- Joins Between Databases On Different Servers Using Python? 的可能重复项 @GordonM 这是一个 PHP 框架,而不是 Phyton 框架和 Eloquent。我认为 Phyton 也没有 Eloquent。因此,不可能重复。不要仅仅为了写作目的而写东西。 高级语言和/或框架不相关。相关的是数据库引擎可以支持和不支持的内容。如果引擎支持跨服务器连接,那么它应该可以在 PHP 和 Python 中使用。如果不是,那么这两种语言都不可能。 @SNaRe,Gordon 说的没错。他可能应该提供更多信息。关键是如果你认为你可以在没有 Laravel/Eloquent(即命令行 MySQL 或其他东西)的情况下做到这一点那么这是 Laravel/Eloquent 中的一个潜在问题/问题,但我很确定一个真正的SQL JOIN 不可能跨服务器。现在,如果您想知道如何合并两个 Laravel Collections(基于来自两个不同连接的结果),或者可能看到非本地外键关系的结果(1 个表一个服务器,1 个在另一个服务器上),这完全是另一回事。 【参考方案1】:

如果这 2 个数据库位于不同的服务器上,则不能这样做。至少不简单。我读到了storage engine。但我以前从未尝试过这样做。

但是

如果有数据库在同一台服务器上,你可以通过简单的连接来完成,如果用户有正确的权限

【讨论】:

【参考方案2】:

基本上你不能使用 Eloquent ORM 或 Laravel 的查询构建器来做到这一点。

但是,您可以尝试使用原始表达式 (https://github.com/laravel/framework/blob/8865d2276be94f0a3497ba3bd26c906ae9e91e1c/src/Illuminate/Database/Query/Expression.php#L13) 或类似这样的东西,但您必须编写代码来根据查询结果制作模型。

如果你使用 laravel 4,这个问题会有所帮助:Laravel 4: how to run a raw SQL?

【讨论】:

laravel.com/docs/5.0/queries#raw-expressions 我看到了原始方法,但是当我使用它时,我将如何将这两个数据库连接名称附加到我的原始 sql 代码中?我对原始 SQL 没意见。我只是要解决这个问题。 我认为是这样的:***.com/questions/17132206/…【参考方案3】:

编写一个原始查询并使用 laravel DB 方法来转义数据。

$results = DB::select( DB::raw("SELECT Users.id, Properties.name FROM [Database1].[dbo].[Users] join [Database2].[dbo].[Properties] on Users.id = Properties.user_id where [so].[dbo].[Users].id = :user_id"), array('user_id' => Input::get('user_id', -1)));

【讨论】:

【参考方案4】:

你不能在不同的数据库服务器之间做mysql join,这是mysql的一个限制,与laravel或eloquent无关。

最好的办法是使用已有的 2 个不同的数据库连接,然后通过 php 代码合并和查询数据。

【讨论】:

以上是关于如何使用 Laravel Eloquent 在不同服务器上的多个数据库之间执行连接查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?

在 Laravel 中扩展 Eloquent 模型(使用不同的表)

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

Laravel Eloquent发现并返回两种不同的类型?

Laravel Eloquent groupBy orderBy 在 MariaDB 中给出不同的结果

如何查询 Laravel Eloquent 的 belongsTo 关系?