Where子句不被尊重?

问题描述:

我有一个问题,我的查询中的where子句不受尊重。这是我使用的查询: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'' 

我不知道我错过了什么..

谢谢!

+0

是否有可能的时间成分是不同的?此外,您将“0000-00-00”与日期进行比较的目的是什么?这对我来说似乎毫无意义。 –

+0

我已经检查了结构,并且都是在标准'日期'合成器中。唯一的区别是对于1,默认值是0000-00-00,对于其他默认值是NULL。但这不应该有所作为 我想你的意思是“where('tblhosting.termination_date','=','0000-00-00')”。如果该字段是0000-00-00,那么托管软件包不会被终止。如果它包含一个值,它将被终止。 – mitch2k

+0

2个表中的'nextduedate'列的类型是什么? –

你可以给这个代码试试:

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

这是有效的!非常感谢! – mitch2k

+0

高兴地记住,通常的'where'子句将第三个参数视为一个字符串。 –

问题是,不是相信正确的列是一个列,它将其解析为一个字符串,所以Where的结果将被解析为2017-12-23 = tbldomains.nextduedate。要解决此问题,您必须使用whereRaw

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

编辑

在Laravel您在查询日期打交道时使用whereDate。因此,您的查询应该是这个样子:

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

我试过这个: - > whereDate('tblhosting.nextduedate','!=','tbldomains.nextduedate'),但仍然是相同的,我害怕 – mitch2k

+1

你试过打印出查询日志? DB:enableQueryLog(); DB :: getQueryLog() –

+0

返回: [查询] => select *,'tbldomains'.'nextduedate' as'domainnextduedate','tblhosting'.'nextduedate' as'hostingnextduedate','tbldomains'.'id 'as'domainid','tblhosting'.'id'作为''从'tblhosting'的'hostingid'内部连接'tblclients'在'tblhosting'.'userid' ='tblclients'.'id'内部连接'tbldomains' on'tblhosting '.'domain' ='tbldomains'.'domain' where date('tblhosting'.'nextduedate'')!=? [绑定] =>数组 ( [0] => tbldomains.nextduedate ) [时间] => 9.77 ) – mitch2k