1. 程式人生 > >laravel原生sql操作以及like模糊查詢的坑點

laravel原生sql操作以及like模糊查詢的坑點

此篇文章基於

  • laravel版本:5.5

laravel基於DB的原生查詢可以使用 DB facade 執行查詢。DB facade 為每種型別的查詢提供了方法:selectupdateinsertdeletestatement。以下是知識點:

(1)執行查詢語句

$users = DB::select('select * from users where active = ?', [1]);

(2)執行插入語句

可以在 DB facade 上使用 insert 方法來執行 insert 語句。與 select 一樣,該方法將原生 SQL 查詢作為其第一個引數,並將其繫結的資料作為第二個引數:

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

(3)執行更新語句

update 方法用於更新資料庫中的現有記錄。該方法會返回受該語句影響的行數:

$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

(4)執行刪除語句

delete 方法用於刪除資料庫中記錄。與 update 一樣,會返回受該語句影響的行數:

$deleted = DB::delete('delete from users');

(5)執行普通語句

有些資料庫語句不會返回任何值。對於這些語句,可以在 DB facade 上使用 statement 方法來操作:

DB::statement('drop table users');

(6)使用命名繫結

除了使用 ? 來表示引數繫結外,你也可以使用命名繫結來執行一個查詢:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

 在實際的使用中使用模糊查詢,發現:

(1)此寫法查詢錯誤

$a = DB::select('select *, 
                        day(WN_DATE) WN_DAYOFMONTH,
                        month(WN_DATE) WN_MONTH,
                        year(WN_DATE) WN_YEAR
                 from mytable
                 where year(WN_DATE)
                 like %?%
                 order by WN_DATE DESC',
                array($_SESSION['filterOn']));

(2)此查詢錯誤

$a = DB::select('select *,
                        day(WN_DATE) WN_DAYOFMONTH,
                        month(WN_DATE) WN_MONTH,
                        year(WN_DATE) WN_YEAR
                 from mytable
                 where year(WN_DATE)
                 like %:filterOn%
                 order by WN_DATE DESC',
                array('filterOn'=>$_SESSION['filterOn'])); 

正確的使用模糊查詢方法:

$query = "select *, day(WN_DATE) WN_DAYOFMONTH, month(WN_DATE) WN_MONTH, year(WN_DATE) WN_YEAR from mytable where year(WN_DATE) like ? order by WN_DATE DESC";

$param = '%'.$_SESSION['filterOn'].'%';

$result = DB::select($query , array($param));