2016-05-23 5 views
0

У меня есть три таблицы customers, organizations и contacts. Таблица customers таблица имеет столбцы customer_class (класс указывает на использование таблицы Organization, Contact) и customer_id (соответствует столбцу id в любом organizations или contacts).Laravel Условно соединять таблицы по указанному классу

Так что я сделал

$interactions = DB::table('sales_interactions') 
->join('customers', 'customers.id', '=', 'sales_interactions.customer_id') 
->join('organizations', function($join) 
{ 
    $join->on('customers.customer_id', '=', 'organizations.id') 
     ->where('customers.customer_class', '=', 'Organization');  
}) 
->join('contacts', function($join) 
{ 
    $join->on('customers.customer_id', '=', 'contacts.id') 
     ->where('customers.customer_class', '=', 'Contact');  
}) 

->select([ 
    'organizations.title as customer', 
    'contacts.name as customer', 
    'sales_interactions.id', 
    'sales_interactions.created_at', 
    'sales_interactions.title', 
    'status', 
    'deadline', 
    'value', 
]); 

Он работал, когда я присоединился только организации. Но соединение контактов возвращает нулевые результаты.

ответ

0

Вам нужен накидной запрос:

$contactsQuery = DB::table('sales_interactions') 
     ->join('customers', 'customers.id', '=', 'sales_interactions.customer_id') 
     ->join('contacts', function($join) 
     { 
      $join->on('customers.customer_id', '=', 'contacts.id') 
       ->where('customers.customer_class', '=', 'Contact'); 
     }) 
     ->select([ 
      'contacts.name as customer', 
      'sales_interactions.id', 
      'sales_interactions.created_at', 
      'sales_interactions.title', 
      'status', 
      'deadline', 
      'value', 
     ]); 

    $interactions = DB::table('sales_interactions') 
     ->join('customers', 'customers.id', '=', 'sales_interactions.customer_id') 
     ->join('organizations', function($join) 
     { 
      $join->on('customers.customer_id', '=', 'organizations.id') 
       ->where('customers.customer_class', '=', 'Organization'); 
     }) 
     ->select([ 
      'organizations.title as customer', 
      'sales_interactions.id', 
      'sales_interactions.created_at', 
      'sales_interactions.title', 
      'status', 
      'deadline', 
      'value', 
     ]) 
     ->union($contactsQuery) 
     ->get(); 
+0

Хорошо, я переделал свою запись с объединением, которое вам нужно ... –

+0

Да, проблема в том, что я всегда ищу сложные способы сделать вещи :) Я пытался выработать что-то вроде 'JOIN ((SELECT organization.title AS клиент из организаций, где customers.customer_class = 'Организация') UNION (SELECT contacts.name AS клиент FROM клиентов, где customers.customer_class = 'Contact')) ', но ваш должен работать нормально, и это все, что вопросы. Благодаря!!! –

+0

Followup - я подаю комбинированный запрос в 'Datatables :: of ($ interactions) ...', когда он пытается запросить все столбцы, я получаю ошибку '1054 Unknown column 'customer' в 'where clause'' –

0

Взгляните на Polimorphic relationship в Laravel док. Я рекомендую использовать larvel orm, потому что это очень хорошо и легко. Это то, что вы ищете, может быть простым запросом.

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