如何在Laravel中查询addSelect创建的字段?

zbdgwd5y  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(221)

在下面的查询中,我使用addSelect函数添加了三个新列

DB::connection('mysql_slave')
        ->table('applications')
        ->whereNull('applications.deleted_at')
        ->when($column != 'contract_return_date' && $column != 'contract_delivery_date',function ($query) use ($column,$date_from,$date_to){
            return $query->whereBetween('applications.'.$column, [$date_from, $date_to]);
        })
        ->join('customers','applications.customer_id','=','customers.id')
        ->join('departments','applications.department_id','=','departments.id')
        ->select([
            'applications.id',
            'applications.customer_id',
            DB::raw('CONCAT(IFNULL(customers.last_name,"")," ",customers.first_name ) as customers_name'),
            DB::raw('CONCAT(IFNULL(applications.last_name,"")," ",applications.first_name ) as contract_name'),
            'applications.offer_type as offer_type',
            'applications.status_id',
            'applications.contract_no',
            'applications.current_provider',
            'applications.extra_offer',
            'applications.offer_warranty',
            'applications.department_id',               
            'customers.mobile_phone as customer_mobile',
            'applications.program as program',
            'applications.saled_by_text as saler',
            'departments.name as department',
            'applications.created_at as created_at',
            'applications.created_at as saled_at',
            DB::raw('IF(applications.sale=1,"NAI","OXI") as sale'),
        ])

        ->addSelect(['submission_date'=> StatusLog::select('created_at')
            ->whereColumn('application_id','applications.id')
            ->where('status','=',1)
            ->latest()
            ->take(1)
        ])

        ->addSelect(['resubmission_date'=> StatusLog::select('created_at')
            ->whereColumn('application_id','applications.id')
            ->where('status','=',2)
            ->latest()
            ->take(1)
        ])
        ->addSelect(['error_date' => StatusLog::select('created_at')
            ->whereColumn('application_id','applications.id')
            ->whereIn('status', [5, 6])
            ->latest()
            ->take(1)
        ]) ->when($column == 'contract_delivery_date',function ($query) use ($date_from,$date_to){
            return $query->whereBetween('submission_date', [$date_from, $date_to]);

        });

上面的查询用于打印数据表上的数据。
查询包括使用addSelect函数添加的列,并且这些列在表中正确显示。
但是,当我尝试查询submission_date字段时,遇到了一个错误:

1054 Unknown Column submission_date.

是否有办法查询使用Laravel中的addSelect函数创建的列?
谢谢你的帮助,我为我的英语错误道歉。

s6fujrry

s6fujrry1#

我认为你不能这样做。自定义选择字段(submission_date)是在主查询结果之后计算的。这是数据库的一个限制。
但是您可以使用HAVING运算符来代替。
https://stackoverflow.com/a/67580272/6901915

pkmbmrz7

pkmbmrz72#

使用addSelect并不创建字段,只是在查询中添加了字段,所以无法进行查询,我们来看一个例子:

create table abc(id int primary key);

是我创建的一个用于概念验证的table。现在,让我们填写一些数据:

insert into abc(id)
values(1),(2);

现在,让我们查询它,向它添加一个名为foo的字段:

select id, 2 * id as foo
from abc;

现在,我们按照foo进行过滤:

select id, 2 * id as foo
from abc
where foo = 2;

我们得到一个错误,如下所示:

因此,如果您想添加一个字段并通过它进行查询,那么您需要将该字段的等价项硬编码到条件中,或者在该字段所在的表中创建一个view,或者将该字段添加到表中。

相关问题