2017-02-25 102 views
0

我有一個問題,我的查詢中的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'列的類型是什麼? –

回答

2

你可以給這個代碼試試:

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

這是有效的!非常感謝! – mitch2k

+0

高興地記住,通常的'where'子句將第三個參數視爲一個字符串。 –

1

問題是,不是相信正確的列是一個列,它將其解析爲一個字符串,所以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