当 Laravel 中具有多态关系时,如何使用 DB::raw 从另一个表中选择列

问题描述 投票:0回答:2

我有 3 个表结构,如下所示:-

库存采购

id 实体类型 实体_id
1 应用程序\模型\供应商 1
2 应用程序\模型\公司 1

供应商

id 名字
1 供应商A
2 供应商B

公司

id 名字
1 A公司
2 B公司

我需要在我的股票购买索引页面中输出entity_name,所以预期的结果将如下所示

预期结果

id 名字
1 供应商A
2 A公司

出于某种原因,我不想使用 $stockPurchase->relation->name,我想输出像 $stockPurchase->entity_name 这样的名称,所以我需要在运行查询时完成它,下面是我当前的代码:-

$model->newQuery()
        ->select([
            'stock_purchases.*',
            DB::raw("(CASE 
            WHEN entity_type = 'App\Models\Supplier' THEN suppliers.name
            WHEN entity_type = 'App\Models\Company' THEN companies.name
            ELSE 'Something went wrong'
            END) AS entity_name"),
        ])
        ->leftJoin('suppliers', function($join){
            $join->on('suppliers.id', '=', 'stock_purchases.entity_id')
            ->where('stock_purchases.entity_type', Supplier::class);
        })
        ->leftJoin('companies', function($join){
            $join->on('companies.id', '=', 'stock_purchases.entity_id')
            ->where('stock_purchases.entity_type', Company::class);
        })
        ->get();

到目前为止我在这个查询中发现了两个问题:-

WHEN entity_type = 'App\Models\Supplier'
这部分总是不匹配,所以我总是会得到“出了问题”作为输出,我认为是因为斜杠,即使我使用双斜杠也会得到相同的结果

THEN suppliers.name
这部分总是返回空,它无法从另一个表获取列

sql laravel polymorphism
2个回答
0
投票

我用 3 个斜杠修复了它

App\\\Models\\\Supplier
,现在正在工作,但我仍然不知道为什么


0
投票

它对我来说有两个反斜杠,我认为这是因为 SQL 将反斜杠视为转义字符:

选择* 来自发票行 其中invoiceable_type != 'App\Models\Payment';

© www.soinside.com 2019 - 2024. All rights reserved.