Php Laravel连接不同数据库中的两个表

Php Laravel连接不同数据库中的两个表,php,mysql,laravel,Php,Mysql,Laravel,我已经在database.php中定义了我的连接: 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'db1'), '

我已经在
database.php
中定义了我的连接:

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'db1'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            ...
        ],

        'mysql2' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_2', '127.0.0.1'),
            'port' => env('DB_PORT_2', '3306'),
            'database' => env('DB_DATABASE_2', 'db2'),
            'username' => env('DB_USERNAME_2', 'root'),
            'password' => env('DB_PASSWORD_2', ''),
         ...
        ],
我想使用来自
db1
的表票证加入来自
db2
的表用户。非常感谢您的帮助。我尝试了下面的方法,但由于票证表来自db1,因此无法识别

$user= DB::connection("mysql2")->table('User')
        ->join('ticket', 'User.Id', '=','ticket.user_id')
        ->select('User.*')
        ->where('ticket.id', '=', 1)
        ->get();

提前感谢

因此,如果他们在同一台服务器上,只需创建如下视图:

CREATE VIEW `D2`.`example` AS SELECT * FROM `D1`.`T1`;

因此,如果它们位于同一台服务器上,只需创建如下视图:

CREATE VIEW `D2`.`example` AS SELECT * FROM `D1`.`T1`;

MySql允许您使用相同的连接和用户从同一主机上的两个数据库进行访问甚至连接。事实上,我有一份每天晚上都这样做的cron工作。我们有两个相同数据的副本,一个是为out客户端提供的实时副本,一个是供管理层编辑的副本,在夜间比较这两个副本并将更改推送到实时副本。这样,如果有人在更新中出错,我们的客户将受到保护,因为它不是立即生效的。这是两个独立的数据库,它们通过一个完整的外部连接的魔力被同步起来。(这是符合我们特定需求的产品,我不会向所有人推荐)

这一点很重要,因为用户必须同时访问这两个数据库,这一点很明显,但经常被忽略,因为人们只是假设情况是这样,但往往不是这样。此外,Mysql关于不访问的错误报告非常糟糕,它通常采取不“看到”另一个数据库的形式,表现得好像它不是他们的数据库(这可能是正确的行为,也可能不是正确的行为,取决于你问谁,在什么环境下)


您的问题可能是第二个数据库的权限问题。

MySql允许您使用相同的连接和用户从同一主机上的两个数据库访问甚至加入。事实上,我有一份每天晚上都这样做的cron工作。我们有两个相同数据的副本,一个是为out客户端提供的实时副本,一个是供管理层编辑的副本,在夜间比较这两个副本并将更改推送到实时副本。这样,如果有人在更新中出错,我们的客户将受到保护,因为它不是立即生效的。这是两个独立的数据库,它们通过一个完整的外部连接的魔力被同步起来。(这是符合我们特定需求的产品,我不会向所有人推荐)

这一点很重要,因为用户必须同时访问这两个数据库,这一点很明显,但经常被忽略,因为人们只是假设情况是这样,但往往不是这样。此外,Mysql关于不访问的错误报告非常糟糕,它通常采取不“看到”另一个数据库的形式,表现得好像它不是他们的数据库(这可能是正确的行为,也可能不是正确的行为,取决于你问谁,在什么环境下)


您的问题可能是第二个数据库的权限问题。

我想要的答案是:

$user=DB::table(DB::raw('sarida_test.user AS db1_tb1'))
            ->join(DB::raw('task_flow.tickets AS db2_tb2'),'db1_tb1.Id','=','db2_tb2.user_id')

我想要的答案是:

$user=DB::table(DB::raw('sarida_test.user AS db1_tb1'))
            ->join(DB::raw('task_flow.tickets AS db2_tb2'),'db1_tb1.Id','=','db2_tb2.user_id')


据我所知,您不能这样做,但如果数据库在同一台服务器上,您无法在实际连接的数据库上创建视图,或者您需要做的是联邦存储引擎,希望如此helps@UlyssesMarx数据库在同一个数据库上server@UlyssesMarx-Mysql允许您同时查询两个数据库,它是唯一的DB引擎之一。需要注意的是,DB用户必须对这两个数据库都有权限,这很可能是您面临的问题。据我所知,您不能这样做,但如果数据库位于同一台服务器上,则您无法在实际连接的数据库上创建视图,或者您需要执行的是联合存储引擎,希望如此helps@UlyssesMarx数据库在同一个数据库上server@UlyssesMarx-Mysql允许您同时查询两个数据库,它是唯一一个这样做的DB引擎。但是需要注意的是,DB用户必须对这两个数据库都有权限,这很可能是您面临的问题。我使用的是laravel如何将其添加到我的代码中,这只是一个sql函数。如果您需要MySQL信息,您怎么能问这个问题,这不是laravel的问题,你需要通过shell或你的管理员连接到mysql,并为你自己的设置修改创建视图。我在哪里询问mysql信息?我在使用laravel如何将其添加到我的代码中,这只是一个sql函数。如果你询问mysql信息,你怎么能问这个问题,这不是laravel的问题,您需要通过shell或您的管理员连接到mysql,并修改自己设置的创建视图。我在哪里询问mysql信息?我已经找到了访问这两个方法所需的sql查询,prbi是在我创建
$data=DB::raw(“…”)时出现的然后
返回视图('view')->带有('user',$user)它不返回任何内容我建议检查您使用的用户是否有权访问其他数据库。例如,仅与该用户一起查询该数据库,看看他们是否可以访问该数据库。如果您可以添加您的方式,这将更容易。这将对我有很大帮助。只需添加您的示例我已经创建了一个mysql2连接,但不知道如何在实际选择查询中使用它您不使用它,您与具有两个数据库访问权限的同一用户使用一个连接。这是如果您想在表上进行连接的话。然后您只需添加
database.table
,而不是
table
,就这么简单。但是用户必须能够访问这两个表。在Laravel中,我不确定您是如何做到的,但它与原始sql无关。您不能在Laravel上做到这一点,简单的方法是您需要通过shell或您的管理员进行连接,然后运行我编写的sql脚本:
创建视图
db1
票证`作为选择*从
db2
票证
`我已经找到了访问这两个方法所需的sql查询,prbi是在我创建
$data=DB::raw(“…”)时出现的然后
返回视图('view')->带有('user',$user)它不返回任何内容我建议检查您使用的用户是否有权访问其他数据库。例如,只向该用户查询该数据库,看看他们是否可以访问该数据库。如果您可以添加这样做的方式,将更容易。这将对我有很大帮助。只需添加