来自Laravel Query Builder中不同数据库的联合查询

时间:2014-11-28 19:04:51

标签: mysql laravel laravel-4

我在两个不同的数据库中有两个相似的表。两个表都有一个包含日期的列和一个包含电子邮件地址的列。虽然列名不一样。因此,我希望有一个结果包含来自两个表的所有记录。

所以我的第一步是:

$emails_1 = DB::connection('db1')->table('contacts_1')->select('mail_address AS email', 'date as created_at');
$emails_2 = DB::connection('db2')->table('contacts_2')->select('email', 'created_at');

所以现在我有两个结果,结果中的列名相同(email和created_at)。

现在我想将结果合并在一起,所以我这样做:

$all_emails = $emails_1->union($emails_2);

这就是我收到错误的地方:

  

找不到基表或视图:1146表' db1.contacts_2'没有按'吨   存在(SQL :(选择mail_addressemaildatecreated_at   来自contacts_1)union(选择emailcreated_at来自   contacts_2))

因此,查询构建器似乎与diferente表混淆。

有人帮忙吗?

2 个答案:

答案 0 :(得分:3)

您不能使用不同的连接,但您仍然可以明确提供数据库名称:

$q1 = DB::table('db1.contacts')
       // where(..) or anything you need here
       ->select('mail_address as email', 'date as created_at');

$q2 = DB::table('db2.contacts')
       // like above
       ->select('email', 'created_at');

$result = $q2->union($q1)->get();

答案 1 :(得分:1)

您无法跨连接执行UNION查询。您必须以两个单独的查询来执行此操作:

$emails1 = DB::connection('db1')->table('contacts_1')
             ->selectRaw('mail_address as email, date as created_at')->get();

$emails2 = DB::connection('db2')->table('contacts_2')
             ->select('email', 'created_at')->get();

$emails = array_merge($emails1, $emails2);