條件將數據從數據庫顯示給最終用戶時,您可能需要能夠過濾最終用戶看到的數據(例如,基於帳戶權限或其他一些訪問權限)。在SQL中,您可以使用WHERE 條件執行此操作- 編輯器PHP庫還提供了一種Editor->where() 方法來公開此功能並允許複雜的條件表達式。 值得注意的是,應用的條件Editor->where() 僅用於數據提取。在編寫數據(創建和編輯動作)時,您應該使用Field->set() 和Field->setValue() 方法。這些將在下面的設置字段值部分中詳細討論。 此外,在將數據寫入數據庫時,應注意所寫數據將由應用的where條件選擇。如果寫入的數據與應用的條件不匹配,則表中不會顯示該數據(如果用戶編輯了一行而導致可能導致可能混淆的行為,並且由於無法讀取而消失了!)。 用法簡單在最簡單的形式中,該Editor->where() 方法有三個參數: columnName - 要應用條件的列名稱value - 檢查條件的值 - 這會自動轉義operator -條件運算符(如= ,< ,> ,等)。此參數是可選的 - 默認值為= 。
一個簡單的例子是: 1 | $editor ->where( 'user_id' , 12 );
|
即只選擇表中的行user_id = 12 。 使用所有三個選項,我們可以使用以下選項來選擇age 大於18的所有行: 1 | $editor ->where( 'age' , 18, '>' );
|
多種條件只需Editor->where() 多次調用(每個條件一次),就可以對錶應用多個條件。例如,讓我們結合上面的兩個例子: 1 2 3 | $editor
->where( 'user_id' , 12 )
->where( 'age' , 18, '>' );
|
僅user_id = 12 AND age > 18 選擇匹配的行。請注意,在簡單用例中,多個Editor->where() 語句將使用AND邏輯運算符。 空值在使用數據庫執行條件操作時,搜索空值(或反向,搜索非空)通常很有用。Editor庫將接受本機PHP null 作為空值。例如,以下內容等同於SQL age IS NULL 條件: 1 | $editor ->where( 'age' , null );
|
所述IS NOT NULL 表達可通過的第三個參數被使用Editor->where() 方法-具體為!= : 1 | $editor ->where( 'age' , null, '!=' );
|
複雜的用法簡單的用例可能很有用,但是Editor->where() 當您使用匿名函數時,會發現該方法的真正功能: 1 2 3 | $editor ->where( function ( $q ) {
...
} );
|
一個參數傳遞到匿名函數中,Query 該實例Editor 將用於數據庫查詢它將使。這意味著您可以訪問Query 類的所有方法Query->where() ,Query->and_where() 並且Query->or_where() (有關類及其方法的完整詳細信息,請參閱PHP API文檔Query )。 age 用匿名函數編寫上面的例子給我們:
1 2 3 | $editor ->where( function ( $q ) {
$q ->where( 'age' , 18, '>' );
} );
|
事情開始變得有趣的是方法的第四個參數Query->where() (注意它與Editor->where() !不同) - 第四個參數是一個可選的布爾參數,它將指示查詢是否應該綁定(即轉義)值。默認情況下,它將是,但禁用綁定意味著我們可以傳入SQL語句,數組和其他復雜表達式。 例如,考慮以下選擇過去14天內的所有記錄(這是MySQL特定的SQL,但顯示的PHP可用於所有數據庫類型): 1 2 3 | $editor ->where( function ( $q ) {
$q ->where( 'date' , 'DATE_ADD( NOW(), INTERVAL -14 DAY )' , '>=' , false );
} );
|
沒有第四個參數,DATE_ADD(...) 它將作為一個字符串進行轉義,但是false 傳入它不會,因此可以進行評估(即WHERE date >= DATE_ADD( NOW(), INTERVAL -14 DAY ) )。 外部變量您可能經常希望使用在匿名函數範圍之外定義的變量作為條件的一部分 - 例如考慮: 1 2 3 4 五 | $userId = 12;
$editor ->where( function ( $q ) {
$q ->where( 'id' , $userId );
} );
|
由於PHP範圍變量的方式,$userId 除非我們使用該use() 指令,否則該參數在匿名函數內是不可訪問的: 1 2 3 | $editor ->where( function ( $q ) use ( $userId ) {
$q ->where( 'id' , $userId );
} );
|
這在PHP匿名函數文檔中有詳細解釋。 分組條件與簡單的用例一樣,只需多次調用條件方法,就可以將多個條件應用於復雜查詢。條件的組合是從左到右,並且基於所謂的方法(即or_where() 和and_where() )。 有點盜夢空間像這些方法都可以接受這將組條件閉合方法本身。考慮以下: 1 2 3 4 五 6 7 8 | $editor ->where( function ( $q ) {
$q
->where( 'age' , '18' , '>' )
->or_where( function ( $r ) {
$r ->where( 'name' , 'Allan' );
$r ->where( 'location' , 'Edinburgh' );
} );
} );
|
以上將產生以下SQL: 1 2 3 | WHERE age > 18 OR (
name = 'Allan' AND location = 'Edinburgh'
)
|
簡單OR條件要在使用編輯器時使用OR條件執行查詢,需要進行分組,如下所示。這是必需的,因為編輯器會在需要時將其自己的條件附加到查詢中。例如,在讀取最近編輯的數據時,將添加主鍵值作為條件以確保僅讀取該記錄。對條件進行分組可確保編輯器添加的條件與您自己的條件之間不會出現錯誤的交互。 1 2 3 4 五 6 7 8 | $editor ->where( function ( $q ) {
$q ->where( function ( $r ) {
$r ->where( 'name' , 'Allan' );
$r ->or_where( 'location' , 'Edinburgh' );
} );
} );
|
子選擇SQL WHERE 語句不僅限於簡單值和函數調用 - 您還可以使用子選項,其中檢查的值本身是另一個查詢的結果。使用可選的綁定參數,Query->where() 我們可以在編輯器查詢中使用子選擇。 以下示例將選擇所有行,這些行的accessLevel 值在access 表的查詢結果數組中: 1 2 3 | $editor ->where( function ( $q ) {
$q ->where( 'accessLevel' , '(SELECT id FROM access WHERE level LIKE "%admin%")' , 'IN' , false );
} )
|
這些表達式可以隨意變得複雜! 綁定提交的數據到目前為止,我們已經處理了非用戶提交的數據,但是如果您已經閱讀了有關SQL安全性的任何信息,那麼在處理用戶數據時您將了解SQL注入攻擊的危險。必須正確轉義此數據!如果使用複雜表達式,其中Query條件方法的綁定參數設置為false,則必須使用該Query->bind() 方法執行此操作。 請考慮以下示例,其中屬性city 作為HTTP POST請求的一部分提交: 1 2 3 4 | $editor ->where( function ( $q ) {
$q ->where( 'location' , '(SELECT id FROM cities WHERE name LIKE :city)' , 'IN' , false );
$q ->bind( ':city' , '%' . $_POST [ 'city' ]. '%' );
} );
|
如果您已經使用PHP的PDO完成了任何工作,那麼您將立即熟悉它。 設置字段值如上所述,類的條件運算符Editor 適用於只讀數據 - 而不適用於寫入數據庫的數據。在寫入數據庫時,您可能希望編輯器編寫不在用戶提交表單中的特定值。例如,updated_date列或可能屬於查詢條件的任何其他內容。 這可以使用Field->set() 和Field->setValue() 方法完成: Field->set() 用於指定何時應該寫入字段 - 它可以是以下之一:true - 與Field::SET_BOTH (默認)相同false - 與...一樣 Field::SET_NONE Field::SET_BOTH - 在create和edit命令上設置數據庫值Field::SET_NONE - 從不設置數據庫值Field::SET_CREATE - 僅在create上設置數據庫值Field::SET_EDIT - 僅在編輯時設置數據庫值
Field->setValue() 是寫入數據庫時要使用的值。
請考慮以下兩個字段:創建日期字段和更新字段: 1 2 3 4 五 6 7 8 9 10 11 | $editor ->field(
new Field( 'created' )
->set( Field::SET_CREATE )
->setValue( date ( "Y-m-d H:i:s" ) )
);
$editor ->field(
new Field( 'updated' )
->set( Field::SET_EDIT )
->setValue( date ( "Y-m-d H:i:s" ) )
);
|
此方法還可用於將可能存儲在會話中的信息(例如編輯器的id)寫入數據庫: 1 2 3 4 | $editor ->field(
new Field( 'last_author' )
->setValue( $_SESSION [ 'user_id' ] )
);
|
|