DQL лучше, чем объектный синтаксис с использованием Doctrine 2? - PullRequest
0 голосов
/ 04 сентября 2011

Я пытаюсь освоить доктрину, у меня была возможность взглянуть на некоторые вещи DQL и я смог сделать несколько простых вставок, таких как:

 function insert_user($username,$email,$password) 
        {
$user = new User();
$user->setUsername($username);
$user->setEmail($email);
$user->setPassword(md5($password));

    try {
            //save to database
            $this->em->persist($user);
            $this->em->flush();
        }
        catch(Exception $err){

            die($err->getMessage());

            return false;
        }
        return true;
        }

Тем не менее, я все еще испытываю трудности с точки зрения того, как выполнить процедуру, такую ​​как аутентификация по имени пользователя / паролю. Например, у меня есть:

    function validate_user($username,$password) 
            {
$query = $this->em->createQuery('SELECT u from User u WHERE u.username = :name AND u.username = :name2');
$query->setParameters(array(
    'name' => $username,
    'name2' => $password,
));
$users = $query->getResult(); // array of user objects
            }

Вот мой класс сущности:

<?php



use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @Table(name="user")
 * @Entity
 */
class User
{
    /**
     * @var integer $id
     *
     * @Column(name="id", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string $username
     *
     * @Column(name="username", type="string", length=300, nullable=false)
     */
    private $username;

    /**
     * @var string $email
     *
     * @Column(name="email", type="string", length=300, nullable=false)
     */
    private $email;

    /**
     * @var string $password
     *
     * @Column(name="password", type="string", length=300, nullable=false)
     */
    private $password;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set username
     *
     * @param string $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     * Get username
     *
     * @return string 
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set email
     *
     * @param string $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     */
    public function setPassword($password)
    {
        $this->password = $password;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }
}

Полагаю, я могу понять это в DQL, но не слишком уверен, как это сделать, используя синтаксис объекта.

Надеюсь, мой вопрос имеет смысл, поскольку я просто пытаюсь познакомиться.

Еще раз спасибо

1 Ответ

1 голос
/ 04 сентября 2011

В соответствии с документацией доктрины 2 вы не можете ВСТАВИТЬ, используя DQL:

DQL как язык запросов имеет конструкции SELECT, UPDATE и DELETE, которые сопоставляются с их соответствующим оператором SQLтипы. Операторы INSERT недопустимы в DQL , поскольку сущности и их отношения необходимо вводить в контекст постоянства с помощью EntityManager # persist (), чтобы обеспечить согласованность вашей объектной модели.

Тем не менее, я согласен с вами, что вставка с использованием DQL может помочь нам выполнить некоторые задачи, в том числе отношения многие ко многим, в некоторых случаях намного проще.

...