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''
我不知道我错过了什么..
谢谢!
你可以给这个代码试试:
->whereColumn('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')
这是有效的!非常感谢! – mitch2k
高兴地记住,通常的'where'子句将第三个参数视为一个字符串。 –
问题是,不是相信正确的列是一个列,它将其解析为一个字符串,所以Where的结果将被解析为2017-12-23 = tbldomains.nextduedate
。要解决此问题,您必须使用whereRaw
。
->whereRaw('tblhosting.nextduedate <> tbldomains.nextduedate')
编辑
在Laravel您在查询日期打交道时使用whereDate。因此,您的查询应该是这个样子:
->whereDate('tblhosting.nextduedate', '!=', 'tbldomains.nextduedate')
我试过这个: - > whereDate('tblhosting.nextduedate','!=','tbldomains.nextduedate'),但仍然是相同的,我害怕 – mitch2k
你试过打印出查询日志? DB:enableQueryLog(); DB :: getQueryLog() –
返回: [查询] => 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
是否有可能的时间成分是不同的?此外,您将“0000-00-00”与日期进行比较的目的是什么?这对我来说似乎毫无意义。 –
我已经检查了结构,并且都是在标准'日期'合成器中。唯一的区别是对于1,默认值是0000-00-00,对于其他默认值是NULL。但这不应该有所作为 我想你的意思是“where('tblhosting.termination_date','=','0000-00-00')”。如果该字段是0000-00-00,那么托管软件包不会被终止。如果它包含一个值,它将被终止。 – mitch2k
2个表中的'nextduedate'列的类型是什么? –