数据库和推动

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

数据库和推动

最常见的和具有挑战性的任务对于任何应用程序包括持久化和阅读信息和从数据库。ob娱乐下载Symfony不与任何orm但推动一体化集成是很容易的。安装驱动,阅读使用Symfony2ob娱乐下载在推动文档。欧宝官网下载app

一个简单的例子:一个产品

在本节中,您将配置数据库,创建一个产品对象持久化到数据库并获取它。

如果你想跟随在本章的例子中,创建一个AcmeStoreBundle通过:

1
php应用程序/控制台生成:美元= Acme / StoreBundle包——名称空间

配置数据库

在开始之前,您需要配置您的数据库连接信息。按照惯例,这些信息通常是在一个配置应用程序/配置/ parameters.yml文件:

1 2 3 4 5 6 7 8
# app / config / parameters.yml参数:database_driver:mysqldatabase_host:本地主机database_name:test_projectdatabase_user:database_password:密码database_charset:use UTF8

请注意

通过定义配置parameters.yml只是一个惯例。该文件中定义的参数引用的主要配置文件设置推动时:

这些参数中定义parameters.yml现在可以包含在配置文件(config.yml):

1 2 3 4 5 6
推动:dbal:司机:“% database_driver %”用户:“% database_user %”密码:“% database_password %”dsn:“% database_driver %:主机= % database_host %; dbname = % database_name %; charset = % database_charset % "

现在推动知道数据库,Symfony可以为您创建数据库:ob娱乐下载

1
php应用程序/控制台推动美元:数据库:创建

请注意

在本例中,您有一个连接,配置命名默认的。如果您想要配置多个连接,读取PropelBundle配置节

创建一个模型类

在推动世界,被称为ActiveRecord类模型因为类生成的推动包含一些业务逻辑。

请注意

对于那些使用Symfony Doctrob娱乐下载ine2,模型相当于实体

假设您要构建一个应用程序,需要显示的产品。首先,创建一个schema.xml文件里面的资源/配置你的AcmeStoreBundle目录:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><数据库的名字=“默认”名称空间=“Acme \ StoreBundle \模式”defaultIdMethod=“本地”><的名字=“产品”><的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/ ><的名字=“名称”类型=“varchar”primaryString=“真正的”大小=“100”/ ><的名字=“价格”类型=“小数”/ ><的名字=“描述”类型=“用longvarchar”/ >< />< /数据库>

建筑模型

在创建你的schema.xml通过运行,生成您的模型:

1
php应用程序/控制台驱动:美元模式:构建

这个生成每个模型类应用程序的快速开发模型/AcmeStoreBundle包的目录。

创建数据库表/模式

现在你有一个可用的产品类和所有你需要坚持它。当然,你还没有相应的产品表在数据库中。幸运的是,推动可以自动创建所需的所有数据库表所有已知模型在您的应用程序。要做到这一点,运行:

1 2
php应用程序/控制台推动美元:sql:构建php应用程序/控制台推动美元:sql:插入——力量

数据库现在有一个全功能产品模式匹配的表和列你指定。

提示

您可以运行最后三个命令组合使用以下命令:php应用程序/控制台驱动:构建——插入sql

持久化对象到数据库

现在,您已经有了一个产品对象和相应的产品表,你准备保存数据到数据库中。在一个控制器,这是非常容易的。添加以下方法DefaultController包:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / Acme / StoreBundle /控制器/ DefaultController.php/ /……使用Acme\StoreBundle\模型\产品;使用ob娱乐下载\组件\HttpFoundation\响应;公共函数createAction(){美元产品=产品();美元产品- >setName (“Foo酒吧”);美元产品- >setPrice (19.99);美元产品- >setDescription (“Lorem ipsum悲哀”);美元产品- >save ();返回响应(“创建产品id”美元产品- >getId ());}

在这段代码中,您实例化和工作美元的产品对象。当你打电话给save ()方法,你坚持到数据库。不需要使用其他服务,对象知道如何坚持本身。

请注意

如果你按照这个例子中,您将需要创建一个路线指向这个动作看它的实际应用。

从数据库中获取对象

获取一个对象从数据库更加容易。例如,假设您已经配置了一个显示一个特定的路线产品基于其id值:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……使用Acme\StoreBundle\模型\ProductQuery;公共函数showAction(美元id){美元产品= ProductQuery::create ()- >findPk (美元id);如果(!美元产品){美元- >createNotFoundException (“没有发现产品id”美元id);}/ /……做点什么,比如通过美元产品对象到一个模板}

更新一个对象

一旦你获取一个对象从推动,更新很容易。假设您有一个路线,产品id映射到一个更新控制器中的动作:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ /……使用Acme\StoreBundle\模型\ProductQuery;公共函数updateAction(美元id){美元产品= ProductQuery::create ()- >findPk (美元id);如果(!美元产品){美元- >createNotFoundException (“没有发现产品id”美元id);}美元产品- >setName (“新产品的名字!”);美元产品- >save ();返回美元- >重定向(美元- >generateUrl (“主页”));}

更新对象包括三个步骤:

  1. 获取对象从推动(6 - 13)行;
  2. 修改对象(15行);
  3. 它保存(16行)。

删除一个对象

删除一个对象非常类似于更新,但需要调用delete ()方法对象:

1
美元产品- >删除();

查询对象

推进提供了生成查询类运行基本和复杂的查询没有任何工作:

1 2 3 4 5
Acme \ \ StoreBundle \ \ ProductQuery模型::create ()- >findPk (美元id);Acme \ \ StoreBundle \ \ ProductQuery模型::create ()- >filterByName (“Foo”)- >findOne ();

想象一下你想要查询产品成本超过19.99,下令从便宜的到最昂贵的。在一个控制器,请执行以下操作:

1 2 3 4
美元产品Acme = \ \ StoreBundle \ \ ProductQuery模型::create ()- >filterByPrice (数组(“最小值”= >19.99))- >orderByPrice ()- >find ();

在一行,你让你的产品在一个强大的面向对象的方法。不需要浪费你的时间使用SQL, Symfony提供了完全的面向对象编程和推动方面相同的哲学通过提供ob娱乐下载一个抽象层。

如果你想重复使用某些查询,您可以添加您自己的方法ProductQuery类:

1 2 3 4 5 6 7 8 9
/ / src / Acme / StoreBundle /模型/ ProductQuery.phpProductQuery扩展BaseProductQuery{公共函数filterByExpensivePrice(){返回美元- >filterByPrice (数组(“最小值”= >1000年));}}

但注意,推动产生很多对你和一个简单的方法findAllOrderedByName ()可以编写没有任何努力:

1 2 3
Acme \ \ StoreBundle \ \ ProductQuery模型::create ()- >orderByName ()- >find ();

关系/协会

假设应用程序中的产品都属于一个“类别”。在这种情况下,您将需要一个类别与一个对象和一个方法产品对象一个类别对象。

先添加类别在你的定义schema.xml:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><数据库的名字=“默认”名称空间=“Acme \ StoreBundle \模式”defaultIdMethod=“本地”><的名字=“产品”><的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/ ><的名字=“名称”类型=“varchar”primaryString=“真正的”大小=“100”/ ><的名字=“价格”类型=“小数”/ ><的名字=“描述”类型=“用longvarchar”/ ><的名字=“category_id添加”类型=“整数”/ ><外键foreignTable=“类别”><参考当地的=“category_id添加”外国=“id”/ >< /外键>< /><的名字=“类别”><的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/ ><的名字=“名称”类型=“varchar”primaryString=“真正的”大小=“100”/ >< />< /数据库>

创建的类:

1
php应用程序/控制台驱动:美元模式:构建

假设您已经在您的数据库产品,你不想失去他们。由于迁移,推动将会更新您的数据库而不失去现有数据。

1 2
php应用程序/控制台推动美元:迁移:generate-diff美元php应用程序/控制台驱动:迁移:迁移

你的数据库已经更新,你可以继续编写应用程序。

现在,试着操作的代码。想象一下你在一个控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
/ /……使用Acme\StoreBundle\模型\类别;使用Acme\StoreBundle\模型\产品;使用ob娱乐下载\组件\HttpFoundation\响应;DefaultController扩展控制器{公共函数createProductAction(){美元类别=类别();美元类别- >setName (主要产品的);美元产品=产品();美元产品- >setName (“Foo”);美元产品- >setPrice (19.99);/ /与本产品类别美元产品- >setCategory (美元类别);/ /保存完整美元产品- >save ();返回响应(“创造了产品id:”美元产品- >getId ()。和类别id:美元类别- >getId ());}}

现在,添加一行到类别产品表。的product.category_id列新产品将任何新类别的id。推动管理这种关系的持久性。

当您需要获取相关的对象,你的工作流看起来就像以前一样。首先,拿一个美元的产品对象,然后访问相关类别:

1 2 3 4 5 6 7 8 9 10 11 12 13
/ /……使用Acme\StoreBundle\模型\ProductQuery;公共函数showAction(美元id){美元产品= ProductQuery::create ()- >joinWithCategory ()- >findPk (美元id);美元categoryName=美元产品- >getCategory ()- >getName ();/ /……}

注意,在上面的例子中,只有一个查询。

更多信息协会

你会发现更多信息通过阅读专门一章的关系的关系

生命周期回调

有时,您需要执行一个动作之前或之后插入一个对象,更新或删除。这些类型的行为被称为“生命周期”回调或“钩子”,作为他们回调方法,您需要执行在一个对象的生命周期的不同阶段(如对象插入、更新、删除等)。

添加一个钩子,只是对象类添加一个新方法:

1 2 3 4 5 6 7 8 9 10
/ / src / Acme / StoreBundle /模型/ Product.php/ /……产品扩展BaseProduct{公共函数preInsert(\ PropelPDO美元反对= null){/ /插入对象之前做点什么}}

推进提供了以下挂钩:

preInsert ()
代码执行前插入一个新对象。
postInsert ()
代码执行后插入一个新对象。
preUpdate ()
代码之前执行更新现有的对象。
postUpdate ()
代码后执行更新现有的对象。
preSave ()
代码执行前保存一个对象(新的或现有的)。
postSave ()
代码执行后保存一个对象(新的或现有的)。
preDelete ()
代码执行前删除一个对象。
postDelete ()
代码后执行删除一个对象。

行为

所有捆绑行为推动正在与Symfony。ob娱乐下载获得更多关于如何使用推动行为的信息,看一下行为参考部分

命令

你应该阅读专用部分推动命令Symfony2ob娱乐下载

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。