2016-09-21 297 views
0

我一直在試圖用where子句編寫一個大規模的update查詢,我發現Laravel 5.3 Eloquent Query Builder會產生語法錯誤。在Laravel 5中使用單引號引起的語法錯誤Eloquent Query Builder

查詢如下:

$query = $this->model 
    ->where('state', "pending") 
    ->whereRaw('created_at <= NOW() - INTERVAL 12 HOUR') 
    ->update(['state' => "timeout"]); 

這是翻譯成這樣:

update `orders` 
set `state` = timeout, `updated_at` = 2016-09-21 21:47:39 
where `state` = pending and created_at <= NOW() - INTERVAL 12 HOUR 

該查詢持續失敗,因爲該列stateupdated_at值不單引號寫入。

我該如何強制Laravel寫出正確的單引號?

回答

1

也許嘗試where('created_at', DB::raw('NOW() - ..'));

而且你爲什麼把peding在單引號? Laravel自動轉義值。

+0

我知道我可以使用DB :: raw,但我想找到更多...優雅的解決方案,可以說。我使用雙引號,因爲查詢生成器也將它們刪除,如果我使用單引號...也許這與主要問題有關? (順便說一下'國家'是一個枚舉) – Mumpo

+0

枚舉不應該有所作爲,因爲字符串無論如何發送到MySQL。我認爲DB :: raw會是一個更優雅的解決方案。如果你像這樣開始黑客攻擊,那麼我建議只寫一個原始查詢。 –

+0

我寧願使用查詢生成器工具。我已經編輯了這個問題,在'state'列中加入了單引號的問題,我想他們可能會有關聯 – Mumpo

0

使用類似

$results = MyModel::where('user_id', Auth::user()->id) 
      ->where('created_at','>=',\DB::raw('"'.$from.'"')) 
      ->where('created_at','<=',\DB::raw('"'.$to.'"')) 
      ->orderby('id','desc') 
      ->paginate(15); 

希望這有助於。

相關問題