Laravel 根据指定 class 有条件地连接表
Laravel Conditionally join tables based on specified class
我有三个 table customers
、organizations
和 contacts
。 Table customers
table 有列 customer_class
(class 表示 table 使用 Organization
、Contact
)和 customer_id
(对应于 organizations
或 contacts
中的 id
列)。
所以我所做的是
$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',
]);
它只在我加入组织时有效。但是加入联系人 returns 结果为零。
您需要联合查询:
$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();
查看 laravel 文档中的 Polimorphic relationship。我推荐使用 laravel orm,因为它非常好而且简单。您要找的这个可以简单查询。
我有三个 table customers
、organizations
和 contacts
。 Table customers
table 有列 customer_class
(class 表示 table 使用 Organization
、Contact
)和 customer_id
(对应于 organizations
或 contacts
中的 id
列)。
所以我所做的是
$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',
]);
它只在我加入组织时有效。但是加入联系人 returns 结果为零。
您需要联合查询:
$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();
查看 laravel 文档中的 Polimorphic relationship。我推荐使用 laravel orm,因为它非常好而且简单。您要找的这个可以简单查询。