2010-04-20 46 views
2

在這裏我們得到了一個位置參數:查詢中的位置和命名參數是什麼意思?

SELECT 
u 
FROM ForumUser u 
WHERE u.id = ?1 

這裏命名參數:

SELECT 
u 
FROM ForumUser u 
WHERE u.username = :name 

這是DQL(教義查詢語言),但我認爲這個概念是一樣的。

可能有人請解釋這些意味着什麼和做什麼?

回答

3

位置參數是由它的子句中索引設定。

命名參數是由它的名稱設置。

當設置的值,你可能有值的數組,在這種情況下定位方式都我更有用。或者,您可以按名稱將它們放在關聯數組中,在這種情況下,指定的表單更有用。


更新 - 雖然文檔是指位置參數,例如?1,實施例只是使用?

位置參數的該實施例通過提供到在查詢中的位置的佔位符的數組中的位置映射值。

$q = Doctrine_Query::create() 
    ->from('User u') 
    ->where('u.username = ? and u.age = ?', array('Arnold', 50)); 

$users = $q->fetchArray(); 

但是,此示例將關聯數組中的值按名稱映射到其命名佔位符。看看他們如何不需要按順序。

$q = Doctrine_Query::create() 
    ->from('User u') 
    ->where('u.username = :username and u.age = :age', 
     array(':age' => 50, ':username' => 'Arnold')); 

(不得不承認我不是一個PHP的傢伙 - 基於實例here以上。)

+0

抱歉無法理解。條款中的索引?和什麼數組?你能告訴我上面的函數會做什麼嗎?我仍然沒有得到u.id =?1部分。 – 2010-04-20 20:15:06

+0

'?1'是查詢定義中的*佔位符*。在運行時,它將被參數值列表中的第一個值替換。在給定的例子中,當查詢執行時'?1'將被替換爲'Arnold'。第二個示例使用*命名參數*來實現相同的目的,因此':username'將替換爲運行時參數列表中鏈接到'用戶名'的值,在這種情況下也是'Arnold'。 – DaveE 2010-04-20 20:35:41

+0

@DaveE等等是什麼?就像我發現的例子一樣?提供像?1這樣的數字是否允許您在查詢中聲明它們的順序? – Brabster 2010-04-20 20:53:19

0

,如果我的理解正確的,我不kown,所以這就是我的想法:

位置參數應使用整數索引進行索引,並且應通過名稱訪問命名參數。

實施例(這是僞代碼):

query.SetParameter(0,456); //這裏我們將值456設置爲第一個參數,索引爲零 query.SetParameter(「username」,「John Smith」); //這裏我們設置值「約翰·史密斯」命名參數「用戶名」

1

位置參數由它們在查詢順序指定。命名參數由其名稱指定。

使用時必須添加它們以相同的順序,他們在查詢中使用位置參數,如果你想使用同一個值一旦你擁有了它多次添加爲單獨參數的更多。

使用名稱參數,你可以在任何你想要的順序來添加,並且參數可以用來比查詢一次。

例如,如果你有一個查詢,以搜索在幾個領域,使用定位參數它可能看起來像這樣:

select u.UserId, u.UserName 
from FormumUser u 
where u.UserName like ? or u.Email like ? or u.Address like ? 

你將不得不三次添加搜索字符串作爲單獨的參數。使用名稱參數它可能看起來像:

select u.UserId, u.UserName 
from FormumUser u 
where u.UserName like @find or u.Email like @find or u.Address like @find 

然後,你只會添加一個參數,因爲查詢可以在三個地方使用相同的參數。

(在查詢中使用參數的確切語法當然會因您使用的數據庫解決方案而異。)

+0

對不起,但我沒有得到它。你能給我一個非常基本的例子,說明我們爲什麼要使用它,它會返回什麼? – 2010-04-20 20:17:15

+0

@ajsie:我在上面添加了一個例子。 – Guffa 2010-04-20 21:09:53

+0

感謝您的解釋! – 2010-04-20 23:33:25

相關問題