设为首页 收藏本站
查看: 443|回复: 0

[经验分享] 关注PHP的ORM框架 -- propel

[复制链接]

尚未签到

发表于 2017-4-3 06:00:16 | 显示全部楼层 |阅读模式
最近在看PHP的 rails式的框架 symfony,这是个整合的框架,ORM框架用的是 propel.基于xml配置的PHP ORM.
粗略的看了一下还是比较勥的.
官方文档
支持: 至少php 5.2.x
Lisense : lgpl v3
安装:
推荐使用pear 安装. 需要 phing 支持

//添加更新源
pear channel-discover pear.phpdb.org
pear channel-discover pear.phing.info
//安装propel生成器,类似hibernate
pear install  --alldeps phpdb/propel_generator
//安装运行支持库
pear install --alldeps  phpdb/propel_runtime


从现有的数据库中迁移:
propel支持从现有的数据库结构中生成 schema.xml .可以使用 自带的引擎
propel-gen ./ reverse
或者 cropel
propel-gen ./ creole
需要一个配置文件 build.properties

propel.project = 项目名称
# The Propel driver to use for generating SQL, etc.
propel.database = mysql
# This must be a PDO DSN
propel.database.url = mysql:dbname=test
propel.database.user = root
# propel.database.password =


迁移时可以使用
propel-gen ./ sql
来迁移数据库结构
当然也可以使用
propel-gen ./ datadump
将数据导出来
详细说明请看 这里
---------------------------------我是分割线----------------------------

配置:
类似hibernate,propel也需要一个映射的配置文件 schema.xml
查看它的DTD
根节点

<database name="bookstore" defaultIdMethod="native">
</database>


看一个简单的例子
schema.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!-- 配置数据库名 -->
<database name="bookstore" defaultIdMethod="native">
<!-- 配置实体对应的表 -->
<table name="book" description="Book Table">
<!-- 配置实体熟悉对应的列  -->
<column name="book_id" type="integer" primaryKey="true" autoIncrement="true" required="true" description="Book Id"/>
<column name="title" type="varchar" size="255" required="true" description="Book Title"/>
<column name="isbn" type="varchar" size="24" required="true" phpName="ISBN" description="ISBN Number"/>
<column name="publisher_id" type="integer" required="true" description="Foreign Key for Publisher"/>
<column name="author_id" type="integer" required="true" description="Foreign Key for Author"/>
<!-- 配置实体对应的关系 这里是one to one-->
<foreign-key foreignTable="publisher">
<reference local="publisher_id" foreign="publisher_id"/>
</foreign-key>
<foreign-key foreignTable="author">
<reference local="author_id" foreign="author_id"/>
</foreign-key>
</table>
<table name="publisher" description="Publisher Table">
<column name="publisher_id" type="integer" required="true" primaryKey="true" autoIncrement="true" description="Publisher Id"/>
<column name="name" type="varchar" size="128" required="true" description="Publisher Name"/>
</table>
<table name="author" description="Author Table">
<column name="author_id" type="integer" required="true" primaryKey="true" autoIncrement="true" description="Author Id"/>
<column name="first_name" type="varchar" size="128" required="true" description="First Name"/>
<column name="last_name" type="varchar" size="128" required="true" description="Last Name"/>
</table>
</database>


运行propel的时候需要另一个配置文件 runtime-conf.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<config>
<!-- 如果安装了 pear Log 可以注销这部分. 用来保存pear的错误
<log>
<type>file</type>
<name>/path/to/prople.log</name>
<ident>propel-bookstore</ident>
<level>7</level>
</log>
-->
<propel>
<!-- 配置数据源 -->
<datasources default="bookstore">
<datasource id="bookstore"> <!-- this ID must match <database name=""> in schema.xml -->
<adapter>sqlite</adapter> <!-- sqlite, mysql, myssql, oracle, or pgsql -->
<connection>
<dsn>sqlite2:/path/to/bookstore.db</dsn> <!-- the PDO connection DSN for database -->
</connection>
</datasource>
</datasources>
</propel>
</config>


更多配置说明
---------------------------------我是分割线----------------------------

使用:
终于到使用这个方便的框架的时候了,所有操作都和hibernate非常相似
首先在使用的脚本前加载库,可以放在你的应用的启动器里头

// 设置domain类所在的文件夹 这里假设在build/classes里面.
set_include_path("/path/to/bookstore/build/classes" . PATH_SEPARATOR . get_include_path());
require_once 'propel/Propel.php';
Propel::init("/path/to/bookstore/build/conf/bookstore-conf.php");


一些常用的操作: C.R.U.D 引用

include_once 'build/class/Author.php';
//新建
$author = new Author();
$author->setFirstName("Jack");
$author->setLastName("London");
$author->save();
//获取, AuthorPeer: AuthorPeer 相当域pojo的域类,包含了curd的静态方法, 是自动生成的
$author = AuthorPeer::retrieveByPK(1);
//查询
$c = new Criteria();
$c->add(AuthorPeer::FIRST_NAME, "Karl");
$c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);
$authors = AuthorPeer::doSelect($c);
//或 查询
$c = new Criteria();
$cton1 = $c->getNewCriterion(AuthorPeer::FIRST_NAME, "Leo");
$cton2 = $c->getNewCriterion(AuthorPeer::LAST_NAME,  array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN);
// combine them
$cton1->addOr($cton2);
// add to Criteria
$c->add($cton1);
//直接使用SQL
$con = Propel::getConnection(DATABASE_NAME);
$sql = "SELECT books.* FROM books WHERE NOT EXISTS (SELECT id FROM review WHERE book_id = book.id)";  
$stmt = $con->prepare($sql);
$stmt->execute();
$books = BookPeer::populateObjects($stmt);
//删除
$author = AuthorPeer::retrieveByPK(1);
AuthorPeer::doDelete($author);
//或者
$author->delete();

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359297-1-1.html 上篇帖子: PHP单例模式面试注意事项 下篇帖子: Java和PHP一致的DES编码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表