Laravel 根据指定 class 有条件地连接表

Laravel Conditionally join tables based on specified class

我有三个 table customersorganizationscontacts。 Table customers table 有列 customer_class(class 表示 table 使用 OrganizationContact)和 customer_id(对应于 organizationscontacts 中的 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,因为它非常好而且简单。您要找的这个可以简单查询。