DQL比使用Doctrine 2的对象语法更好吗?

时间:2011-09-04 04:47:41

标签: php orm doctrine doctrine-orm

我试图了解一下学说,并且有机会查看一些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 个答案:

答案 0 :(得分:1)

根据doctrine 2 documentation,你不能使用DQL INSERT:

  

DQL作为查询语言具有SELECT,UPDATE和DELETE构造   映射到相应的SQL语句类型。 INSERT语句是   在DQL中不允许,因为实体及其关系必须是   通过引入持久化上下文    EntityManager#persist()以确保对象模型的一致性。

但是我同意你的观点,使用DQL进行插入可以帮助我们在某些情况下更轻松地完成包括多对多关系在内的一些任务。