这里我们得到了一个位置参数:
SELECT
u
FROM ForumUser u
WHERE u.id = ?1
这里是一个命名参数:
SELECT
u
FROM ForumUser u
WHERE u.username = :name
这是 DQL(教义查询语言),但我认为这个概念是相同的。
有人可以解释一下这些是什么意思吗?
位置参数由其在子句中的索引设置。
命名参数由其名称设置。
当您设置值时,您可能会将值放在一个数组中,在这种情况下,位置形式可能更有用。或者,您可以按名称将它们放在关联数组中,在这种情况下,命名形式更有用。
更新 - 尽管文档中提到了位置参数,例如?1
,示例只是使用?
.
此位置参数示例按提供的数组中的位置将值映射到查询中的位置占位符中。
$q = Doctrine_Query::create()
->from('User u')
->where('u.username = ? and u.age = ?', array('Arnold', 50));
$users = $q->fetchArray();
但是,此示例按名称将关联数组中的值映射到它们的命名占位符。看看他们如何不需要 tgo 井井有条。
$q = Doctrine_Query::create()
->from('User u')
->where('u.username = :username and u.age = :age',
array(':age' => 50, ':username' => 'Arnold'));
(不得不承认我不是 PHP 人 - 以上基于此处的示例。)
位置参数由它们在查询中的顺序指定。命名参数由它们的名称指定。
使用位置参数时,您必须按照它们在查询中使用的顺序添加它们,如果您想多次使用相同的值,则必须多次添加它作为单独的参数。
使用名称参数时,您可以按您想要的任何顺序添加它们,并且一个参数可以在查询中多次使用。
例如,如果您有一个在多个字段中搜索的查询,使用位置参数它可能如下所示:
select u.UserId, u.UserName
from FormumUser u
where u.UserName like ? or u.Email like ? or u.Address like ?
您必须将搜索字符串作为单独的参数添加 3 次。使用名称参数它可能看起来像:
select u.UserId, u.UserName
from FormumUser u
where u.UserName like @find or u.Email like @find or u.Address like @find
然后您只需添加一个参数,因为查询可以在三个位置使用相同的参数。
(当然,在查询中使用参数的确切语法取决于您使用的数据库解决方案。)
我不知道我是否理解正确,所以这是我的想法:
位置参数应使用整数索引进行索引,命名参数应通过其名称访问。
示例(这是伪代码):
query.SetParameter(0, 456); // 这里我们将值 456 设置为第一个参数,它的索引为零 query.SetParameter("username", "John Smith"); // 这里我们将值“John Smith”设置为名为“username”的参数