ICHARM
symfony2成长笔记之数据库操作
symfony2成长笔记之数据库操作

symfony2成长笔记之安装

symfony2成长笔记之HelloWorld

symfony2成长笔记之POST,GET

symfony2成长笔记之Assetic管理静态文件(CSS/JS/Image)

 

数据库操作逻辑

首先简单介绍一下symfony2中的数据库操作的逻辑。如果裸写php的同学肯定知道,创建数据库和数据表都是通过mysql终端或者phpMyAdmin来进行创建,查询数据就是直接将sql语句交给PDO类,然后得到查询结果的数组,再进行相应的操作。在symfony2中使用doctrine2这一款工具,通过这个工具,可以将一个php的class映射为数据库中的一张表,不需要自己写sql语句,由doctrine2来生成。这个class中的每一个受保护的对象都对应对应表中的一个字段,查询数据,即直接调用这个class的set或者get方法来得到,不需要关注symfony2是如何从数据库中获取到数据的。是不是非常的简单快捷。

 

数据库连接

在操作数据库之前,当然是配置数据库连接的信息。打开app/config/paramters.yml,可以看到这个文件中有数据库的连接和stmp邮件服务器的连接配置项。

# This file is auto-generated during the composer install
parameters:
    database_host: 127.0.0.1      #数据库地址
    database_port: null           #数据库端口,null即为默认3306
    database_name: sf2_demo       #数据库名称
    database_user: root           #用户名
    database_password: root       #密码
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: null
    mailer_password: null
    secret: 56a563bf6b75641cd6e6821b0e3ebfea83082119

 

配置信息填写完成后

symfony2强大的console又来了,使用console命令可以快速的创建一个sf2_demo的数据库:

$ php app/console doctrine:database:create 
Created database `ofs_rms` for connection named default

创建Entity

在所在的bundle下新建一个Entity文件夹,在Entity新建一个user.php的文件,写入如下内容:

<?php

namespace boss\IndexBundle\Entity;                   //文件所在的命名空间

use Doctrine\ORM\Mapping as ORM;                     //引用命名空间并加上别名

/**
 * @ORM\Entity(repositoryClass="UserRepository")//annotation格式配置信息,在创建这个Entity时自动创建UserRepository
 * @ORM\Table(name="user")                      //指定与数据库sf2_demo中的user表相关联
 */
class user{

    /**
     * @ORM\Id                                 //指定id为主键
     * @ORM\Column(type="integer")             //指定id字段的类型为integer
     * @ORM\GeneratedValue(strategy="AUTO")    //指定id字段为自动增加,AUTO必须为大写
     */
    protected $id;

    /**
     * @ORM\Column(type="string")             //指定username字段的类型为string
     */
    protected $username;

    /**
     * @ORM\Column(type="string")            //指定password字段的额类型为string
     */
    protected $password;

}

保存文件,至此一个Entity已经定义完成,现在只需要同 app/console doctrine提供的命令,便可以自动创建数据库、数据表、字段、set-get方法等。

在上一步中已经使用console命令创建一个数据库。这里先使用下面的命令来生成set-get方法:

$ php app/console generate:doctrine:entities bossIndexBundle
Generating entities for bundle "bossIndexBundle"
  > backing up user.php to user.php~
  > generating boss\IndexBundle\Entity\user

可以看到已经成功为bossIndexBundle创建了一个Entity ,并且在user.php 中生成了各个对象的set-get方法,和在user.php同目录新建了一个空的UserRepository.php文件。

做完上面一步,发现数据库并没有user表被新建。所以接下来要将Entity映射到数据库中去,并生成一个个表和字段:

$ php app/console doctrine:schema:update --force  #这个命令需要带上--force这个参数,为了安全,防止误操作
Updating database schema...
Database schema updated successfully! "1" queries were executed

此时已经完全将php的class与数据库对应表向关联起来了。

注意点:
  • 当数据表中的字段需要变更时,需要在次执行上面这两个命令
  • 当Entity有变更时,需要手动维护set-get方法

 

数据操作

数据库操作即增删改查,由于上面建了一个新的空的表,所以先增加一些数据。

1.添加数据

添加数据很简单,只需要new一个User类的对象,然后调用各个set方法来赋值,最后使用Doctrine的EntityManager来插入进数据库。

class DefaultController extends Controller
{
    /**
     * @Route("boss/")
     */
    public function indexAction()
    {
        $user = new useradmin();
        $user->setUsername("icharm");
        $user->setPassword("icharm");


        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($user);
        $em->flush();

        return $this->render('bossIndexBundle:Default:index.html.twig');
    }
}

上面的代码就将一条数据插进了数据库。

 

2.查询数据

查询数据,使用Doctrine的EntityManager的getRepository(“bundle name : entity name”)的方法,具体如下:

class DefaultController extends Controller
{
    /**
     * @Route("boss/")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getEntityManager();
        /** @var $user \boss\IndexBundle\Entity\user */  //这行注释,告诉phpstorm,这个$user是user类的对象,好在后面的编写中正确的进行代码提示。
        $user  = $em->getRepository("bossIndexBundle:user")->findOneBy(array("id"=>1));  //条件,查询id为1的数据,返回一个user类的对象
        $username = $user->getUsername(); //使用get方法获取具体字段的值
        $pwd = $user->getPassword();

        return $this->render('bossIndexBundle:Default:index.html.twig');
    }
}

上面使用的是fundOneBy传递了一个条件,返回的结果只有一条,如果想想查询多条数据,就需要使用其他的方法,比如findBy或者findAll,不过返回的是一个对象数组。

 

3.更新数据

更新数据,即是上面两步的结合,先查询数据,得到类的对象,再使用set方法修改需要修改的值,最后使用persist和flush方法将更改写入数据库。

class DefaultController extends Controller
{
    /**
     * @Route("boss/")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getEntityManager();
        /** @var $user \boss\IndexBundle\Entity\useradmin */
        $user  = $em->getRepository("bossIndexBundle:useradmin")->findOneBy(array("id"=>1));
        $username = $user->setUsername("icharm.me");
        $em->persist($user);
        $em->flush();


        return $this->render('bossIndexBundle:Default:index.html.twig');
    }
}

上面的代码,将id为1的用户名改为icharm.me

 

4.删除数据

删除数据使用remove函数,将entity实例传递进去。

class DefaultController extends Controller
{
    /**
     * @Route("boss/")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getEntityManager();

        /** @var $user \boss\IndexBundle\Entity\useradmin */
        $user  = $em->getRepository("bossIndexBundle:useradmin")->findOneBy(array("id"=>1));

        $em->remove($user);
        $em->flush();


        return $this->render('bossIndexBundle:Default:index.html.twig');
    }
}

上面的代码将id为1的数据删除。

Doctrine对数据的增删改查提供了很多的方法,灵活应用可以达到减少sql查询的次数,取得更好的性能。

 

发表评论

textsms
account_circle
email

ICHARM

symfony2成长笔记之数据库操作
symfony2成长笔记之安装 symfony2成长笔记之HelloWorld symfony2成长笔记之POST,GET symfony2成长笔记之Assetic管理静态文件(CSS/JS/Image)   数据库操作逻辑 首先简…
扫描二维码继续阅读
2017-03-30