symfony 连接mysql报错_symfony2成长笔记之数据库操作

数据库操作逻辑

首先简单介绍一下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查询的次数,取得更好的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值