что означает позиционный и именованный параметр в запросе? - PullRequest
2 голосов
/ 20 апреля 2010

здесь мы получили позиционный параметр:

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

и здесь именованный параметр:

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

это DQL (язык запросов доктрины), но я думаю, что концепция та же самая.

Может кто-нибудь объяснить, что они значат и делают?

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

Позиционный параметр задается его индексом в предложении.

Именованный параметр задается его именем.

Когда вы устанавливаете значения, у вас могут быть значения в массиве, и в этом случае позиционная форма может быть более полезной. В качестве альтернативы, вы можете иметь их в ассоциативном массиве по имени, и в этом случае именованная форма более полезна.


Обновление - хотя документация ссылается на позиционные параметры, как, например, ?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 - выше на примерах здесь .)

1 голос
/ 21 апреля 2010

Позиционные параметры определяются их порядком в запросе. Именованные параметры указываются их именами.

При использовании позиционных параметров вы должны добавлять их в том же порядке, в котором они используются в запросе, и если вы хотите использовать одно и то же значение более одного раза, вы должны добавить его несколько раз в качестве отдельных параметров.

При использовании параметров имен вы можете добавлять их в любом порядке, и параметр может использоваться более одного раза в запросе.

Например, если у вас есть запрос, который ищет в нескольких полях, используя позиционные параметры, он может выглядеть так:

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 голосов
/ 21 апреля 2010

Я не знаю, правильно ли я понял, вот что я думаю:

Позиционные параметры должны быть проиндексированы с использованием целочисленного индекса, а именованные параметры должны быть доступны через их имена.

Пример (это псевдокод):

query.SetParameter (0, 456); // здесь мы устанавливаем значение 456 для первого параметра, индекс которого равен нулю query.SetParameter ("имя пользователя", "Джон Смит"); // здесь мы устанавливаем значение "John Smith" для параметра с именем "username"

...