数据库和推动
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
数据库和推动
最常见的和具有挑战性的任务对于任何应用程序包括持久化和阅读信息和从数据库。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”/ >< /表>< /数据库>
创建数据库表/模式
现在你有一个可用的产品
类和所有你需要坚持它。当然,你还没有相应的产品
表在数据库中。幸运的是,推动可以自动创建所需的所有数据库表所有已知模型在您的应用程序。要做到这一点,运行:
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 (“主页”));}
更新对象包括三个步骤:
- 获取对象从推动(6 - 13)行;
- 修改对象(15行);
- 它保存(16行)。
查询对象
推进提供了生成查询
类运行基本和复杂的查询没有任何工作:
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.php类ProductQuery扩展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 ()
代码后执行删除一个对象
命令
你应该阅读专用部分推动命令Symfony2ob娱乐下载。