SQL 使用 Laravel ORM 在较大的查询中合并 1 列?

SQL Union 1 Column within Larger Query with Laravel ORM?

我目前正在为多个不同的对象存储 addresses。因此 addresses 对应 jobscompanies

我希望能够获得所有 addresses.*jobs.job_title & companies.company_name 的并集到 select 每个 [=13] 的 object_name =] 记录.

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 table 的当前架构: +-------------------+---------------------+------+-----+---------+----------------+ | 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 table 的当前架构: +-----------------+---------------------+------+-----+---------+----------------+ | 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 table 的当前架构: +-----------------+---------------------+------+-----+---------+----------------+ | 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 | +-----------------+---------------------+------+-----+---------+----------------+

我的问题是:如何根据上述结构创建联合和 return 所需的数据?

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 = CompanyobjectType 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

这会根据地址 table 中的对象类型将连接分成多个部分,然后 UNION ALL 将结果放在一起以获得地址和对象名称的最终列表:

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

请注意,对于 objectType 的每个可能值,您必须手动添加要 UNION ALL 编辑的其他查询。