哪个条款不受尊重?

时间:2017-02-25 11:19:23

标签: php mysql laravel

我遇到的问题是我的查询中的where子句不受尊重。这是我正在使用的查询:

Capsule::table('tblhosting')
        ->select('*','tbldomains.nextduedate as domainnextduedate' , 'tblhosting.nextduedate as hostingnextduedate')
        ->join('tblclients', 'tblhosting.userid', '=', 'tblclients.id')
        ->join('tbldomains', 'tblhosting.domain', '=', 'tbldomains.domain')
        ->where('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')
        ->where('tbldomains.status', '=', 'Active')
        ->where('tblhosting.termination_date', '=', '0000-00-00')               
        ->get()

如果我做vardump,我会得到这些值:

    [56] => stdClass Object
    (
        [id] => 406
        [userid] => 9
        [orderid] => 730
        [packageid] => 35
        [server] => 9
        [regdate] => 2016-12-23
        [domain] => xxx.net
        [paymentmethod] => banktransfer
        [firstpaymentamount] => 0.00
        [amount] => 0.00
        [billingcycle] => Annually
        [nextduedate] => 2017-12-23
        [nextinvoicedate] => 2017-12-23
        [termination_date] => 0000-00-00
        [completed_date] => 0000-00-00
        [domainstatus] => Active            
        [domainnextduedate] => 2017-12-23
        [hostingnextduedate] => 2017-12-23
    )

正如你所看到的,tbldomains.nextduedate和tbldomains.nextduedate都是'2017-12-23',所以它们不应该被退回,因为我使用

->where('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')

我认为这可能是因为我使用了别名,但是当我尝试

->where('domainnextduedate', '!=', 'hostingnextduedate')

我收到了PDO错误:

Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'domainnextduedate' in 'where clause'' 

我不确定我错过了什么..

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以尝试使用此代码:

->whereColumn('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')

答案 1 :(得分:1)

问题在于不是认为右列是一列,而是将其解析为字符串,因此where的结果将被解析为2017-12-23 = tbldomains.nextduedate。要解决此问题,您必须使用whereRaw

->whereRaw('tblhosting.nextduedate <> tbldomains.nextduedate')

修改

在Laravel中,您在处理查询中的日期时使用whereDate。因此,您的查询应如下所示:

->whereDate('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')