2014-11-28 4 views
0

У меня есть две одинаковые таблицы в двух разных базах данных. Обе таблицы имеют столбец с датой и один с адресами электронной почты. Хотя имена столбцов не совпадают. В результате я хочу получить один результат, содержащий все записи из обеих таблиц.Объединенные запросы из разных баз данных в Laravel Query Builder

Итак, мой первый шаг:

$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'); 

Так что теперь у меня есть два результата и имена столбцов в результате равны (по электронной почте и created_at).

Теперь я хочу, чтобы объединить результаты вместе, так что я:

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

И это, где я получаю ошибку:

Base table or view not found: 1146 Table 'db1.contacts_2' doesn't exist (SQL: (select mail_address as email , date as created_at from contacts_1) union (select email , created_at from contacts_2))

Таким образом, кажется, что конструктор запросов путается с разные таблицы.

Помощи ли кто-нибудь?

ответ

1

Вы не можете использовать различные соединения, но вы можете сделать это при условии имя БД в явном виде:

$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(); 
2

Вы не можете выполнять запрос 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); 
+0

Является ли $ электронной почты таким образом, все еще экземпляр БД, где я могу делать такие вещи, как $ emails-> где ('...') -> get(); ? – almo

+0

@almo - Nope. '$ emails' - простой массив. Если вы хотите добавить больше ограничений, вам придется добавить их к обоим запросам отдельно. –

+0

не используют array_merge, его не правильно –

Смежные вопросы