2015-03-29 1 views
1

Я в настоящее время храню addresses для нескольких разных объектов. Таким образом, есть addresses для jobs, companies и т.д.SQL Union 1 Column in Larger Query с Laravel ORM?

Я хочу, чтобы иметь возможность получить все addresses.* и объединение jobs.job_title & companies.company_name выбрать object_name для каждого addresses записи.

Address.php (модель)

static $object_type = [ 
    1 => 'Company', 
    2 => 'Job', 
]; 

static public function getObjectTypes() { 
    return self::$object_type; 
} 

static public function getObjectTypeName($key) { 
    return self::$object_type[$key]; 
} 

static public function getAddresses(){ 

    $addresses = Address::select(
     'addresses.*' 
    )->where('addresses.soft_deleted', 0); 

    $addresses->limit(20); 

    return $addresses->get(); 

} 

Текущая схема для addresses таблицы: +-------------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+---------------------+------+-----+---------+----------------+ | id | int(12) unsigned | NO | PRI | NULL | auto_increment | | object_id | int(12) | YES | MUL | 0 | | | object_type | tinyint(3) | YES | | 1 | | | address | varchar(255) | YES | | NULL | | | soft_deleted | tinyint(3) unsigned | YES | | 0 | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +-------------------+---------------------+------+-----+---------+----------------+

Текущая схема для jobs таблицы: +-----------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+----------------+ | id | int(12) unsigned | NO | PRI | NULL | auto_increment | | company_id | int(12) | YES | | 0 | | | job_title | varchar(99) | YES | | NULL | | | soft_deleted | tinyint(3) unsigned | YES | | 0 | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | +-----------------+---------------------+------+-----+---------+----------------+

Текущая схема для companies таблицы: +-----------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+----------------+ | id | int(12) unsigned | NO | PRI | NULL | auto_increment | | company_name | varchar(99) | YES | | NULL | | | soft_deleted | tinyint(3) unsigned | YES | | 0 | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | +-----------------+---------------------+------+-----+---------+----------------+

Мой вопрос: Как создать объединение и вернуть данные, необходимые на основе вышеуказанной структуры?

ответ

1

Here is a SQLFiddle что я думаю вы после. Это очень упрощенная схема, чтобы проиллюстрировать то, что делается:

addresses 
id | objectId | objectType | address 
1 | 1 | 1 | 4657 
2 | 1 | 3 | 3465 
3 | 2 | 4 | 4536 
4 | 1 | 2 | 3098 
5 | 2 | 1 | 5647 
6 | 2 | 2 | 8989 
7 | 1 | 4 | 4563 
8 | 2 | 3 | 2345 

companies 
id | name 
1 | 'Acme Anvils' 
2 | 'McBarfles' 
3 | 'Noke' 
4 | 'Stab Mart' 

jobs 
id | companyId | title 
1 | 4 | 'Fly Swatter' 
2 | 3 | 'Palm Greaser' 
3 | 2 | 'McBarfle Burger Tender' 
4 | 1 | 'Shill' 

Предполагая, что objectType 1 = Company и objectType 2 = Job:

SELECT 
    'Company' AS objectType, 
    c.name, 
    a.address 
FROM addresses a 
INNER JOIN companies c 
    ON a.objectId = c.id 
WHERE a.objectType = 1 

UNION ALL 

SELECT 
    'Job' AS objectType, 
    j.title, 
    a.address 
FROM addresses a 
INNER JOIN jobs j 
    ON a.objectId = j.id 
WHERE a.objectType = 2 

Это разрывает стыки на секции на основе OBJECTTYPE в адресов, затем UNION ALL s для получения окончательного списка адресов и названий объектов:

objectType | name     | address 
Company | Acme Anvils   | 4657 
Company | Noke     | 3465 
Company | McBarfles    | 3098 
Company | Stab Mart    | 4563 
Job  | Shill     | 4536 
Job  | Fly Swatter   | 5647 
Job  | Palm Greaser   | 8989 
Job  | McBarfle Burger Tender | 2345 

Обратите внимание, что вам нужно вручную добавить дополнительные запросы, чтобы быть UNION ALL ed для каждого возможного значения objectType.

+0

Это замечательный Пол - спасибо. Я просто собираюсь принять ваш ответ. Я ценю, что вы тратите время на это. – learn

+0

Я приму благодарность за 20 часов LOL – learn