如何使用 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 中的一个潜在问题/问题,但我很确定一个真正的SQLJOIN
不可能跨服务器。现在,如果您想知道如何合并两个 Laravel Collection
s(基于来自两个不同连接的结果),或者可能看到非本地外键关系的结果(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 模型