http://blog.tarotoast.com/tag/propel/
總之,ORM 就是可以省下寫 database specific SQL 的麻煩的 abstraction 就是了。Symfony 用的是 Propel
,是一個 PHP5 的 database framework,跟 ADOdb
是類似的東西,雖然兩者到底詳細差在哪我也不知道。不過總之 Symfony 的作者們決定用 Propel 來省下許多 code generation 和實作 ORM。
有幾個非常重要的檔案必須編輯好才能使用 Symfony 裡面的 propel 功能。
- myproject/config/databases.yml
- myproject/config/propel.ini
- myproject/config/schema.yml
老實說 propel.ini 和 schema.yml 為啥要有兩個檔案,我也不知道 (as of now)。總之兩個檔案都得把
database 的設定寫進去就是了。然後 schema.yml 才是整個 ORM 的重點,Symfony 就是讀這個檔案生出所有
database object class 的。習慣直接編輯 schema.yml 的話是會很方便,不過老實說我也還不習慣,所以都用
phpmyadmin 先把 database 生好然後再讓 Symfony 生出 schema.yml。
database.yml
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://username:password@localhost/database
propel.ini (上面)
propel.targetPackage = lib.model
propel.packageObjectModel = true
propel.project = myproject
propel.database = mysql
propel.database.createUrl = mysql://username:password@localhost/
propel.database.url = mysql://username:password@localhost/database
大致的生產順序如下:
- 產生 schema.yml (自己編輯或者讓 symfony 照著建好的 database 生)
讓 symfony 照著 database 生出 schema.yml:
symfony propel-build-schema
- 產生 ORM classes
symfony propel-build-model
用這個 schema.yml 當範例
propel:
blog_article:
_attributes: { phpName: Article }
id:
title: varchar(255)
content: longvarchar
created_at:
blog_comment:
_attributes: { phpName: Comment }
id:
article_id:
author: varchar(255)
content: longvarchar
created_at:
會生出 8 個檔案,4 個檔案在 lib/model/om/ 下面 (Base Class):
1. BaseArticle.php
2. BaseArticlePeer.php
3. BaseComment.php
4. BaseCommentPeer.php
然後另外 4 個檔案在 lib/model/ 下面 (Custom Class):
1. Article.php
2. ArticlePeer.php
3. Comment.php
4. CommentPeer.php
生在 lib/model/om/ 下面的檔案只要每次跑 propel-build-model 就會重新被蓋過,所以如果要自己修改
model 增加功能的話,就得修改 lib/model/ 下面的 class。在 Base class 裡面所有 field 的
accessor 都會被自動生出來,也就是說上面這個 yml 生出來的 model 可以這樣使用。
// 單純是示範怎麼用 primary key
$articles = ArticlePeer::retrieveByPks(array(123, 124, 125));
// 使用 setter/getter
$article = new Article();
$article->setTitle('My first article');
$article->setContent('This is my very first article.\n Hope you enjoy it!');
$article->save();
$title = $article->getTitle();
$content = $article->getContent();
// 這才是 ORM 的精華
$comments = $article->getComments();
要如何 Query 比較複雜的判斷呢?答案是用 Criteria 這個 class。以下這段的功能:
$c = new Criteria();
$c->add(CommentPeer::AUTHOR, 'Steve');
$c->addJoin(CommentPeer::ARTICLE_ID, ArticlePeer::ID);
$c->add(ArticlePeer::CONTENT, '%enjoy%', Criteria::LIKE);
$c->addAscendingOrderByColumn(CommentPeer::CREATED_AT);
$comments = CommentPeer::doSelect($c);
其實就等於 SQL 下面的:
SELECT blog_comment.ID, blog_comment.ARTICLE_ID, blog_comment.AUTHOR,
blog_comment.CONTENT, blog_comment.CREATED_AT
FROM blog_comment, blog_article
WHERE blog_comment.AUTHOR = 'Steve'
AND blog_article.CONTENT LIKE '%enjoy%'
AND blog_comment.ARTICLE_ID = blog_article.ID
ORDER BY blog_comment.CREATED_AT ASC
常用到的 condition 可以參考這個列表:
SQL
Criteria
WHERE column = value |
->add(column, value); |
WHERE column <> value |
->add(column, value, Criteria::NOT_EQUAL); |
Other Comparison Operators
|
|
> , < |
Criteria::GREATER_THAN, Criteria::LESS_THAN |
>=, <= |
Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL |
IS NULL, IS NOT NULL |
Criteria::ISNULL, Criteria::ISNOTNULL |
LIKE, ILIKE |
Criteria::LIKE, Criteria::ILIKE |
IN, NOT IN |
Criteria::IN, Criteria::NOT_IN |
Other SQL Keywords
|
|
ORDER BY column ASC |
->addAscendingOrderByColumn(column); |
ORDER BY column DESC |
->addDescendingOrderByColumn(column); |
LIMIT limit |
->setLimit(limit) |
OFFSET offset |
->setOffset(offset) |
FROM table1, table2 WHERE table1.col1 = table2.col2 |
->addJoin(col1, col2) |
FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::LEFT_JOIN) |
FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2 |
->addJoin(col1, col2, Criteria::RIGHT_JOIN)
|
分享到:
相关推荐
Symfony框架是一个基于MVC模式的PHP框架,在该框架中,Model部分通常使用对象关系映射(Object-Relational Mapping,ORM)来对数据库表进行关系映射。Doctrine是Symfony框架中使用的ORM框架。在本节中,我们将学习...
ORM(Object-Relational Mapping)是一种编程技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来操作数据库。在PHP世界中, Doctrine是广泛应用的ORM框架之一,它提供了强大的数据持久...
1. **数据库设计**:项目可能使用了ORM(Object-Relational Mapping)如Doctrine,将数据库操作转换为面向对象的代码。 2. **身份验证与授权**:Symfony的安全组件可以用来处理用户认证和权限控制,确保只有授权...
- ORM(Object-Relational Mapping):如Doctrine,将数据库操作转化为对象操作,提高代码可读性和可维护性。 5. PHP框架的应用: - Laravel:功能强大且优雅的PHP Web开发框架,提供路由、中间件、模板引擎等。 ...
首先,Symfony的ORM组件(Object-Relational Mapping)为我们提供了方便的数据库操作命令行工具。通过执行`symfony console list doctrine`,我们可以看到一系列与数据库相关的命令,例如`doctrine:database:create`...
Spot2是一个针对MySQL数据库的Object-Relational Mapping (ORM)工具,主要应用于PHP开发环境。ORM是一种编程技术,它允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,从而提高了代码的可读性、可...
- **ORM简介**:介绍了对象关系映射(Object Relational Mapping, ORM)的概念,特别是Symfony常用的ORM库Doctrine。 - **实体类**:讲解了如何使用实体类来表示数据库表,以及如何使用这些实体来进行数据操作。 ####...
- ORM(Object-Relational Mapping):如Doctrine,将数据库操作转化为面向对象的方式。 - 数据库事务:确保多条SQL语句的原子性,保证数据一致性。 - PHP模板引擎:如Smarty,将业务逻辑与视图分离,提高代码可...
2. **ORM集成**:Elcodi支持多种Object-Relational Mapping (ORM) 工具,如Doctrine ORM,用于数据库操作。这使得开发者可以使用面向对象的方式来操作数据库,提高开发效率。 3. **模板引擎**:Symfony与Twig模板...
- **对象关系映射(Object-Relational Mapping, ORM)**:Symfony使用Doctrine ORM作为它的对象关系映射工具。ORM允许开发者使用对象来操作数据库,而不是直接使用SQL查询,从而提高了开发的效率。 - **配置数据库...
Symfony ORM组件是Symfony框架提供的一款对象关系映射(Object-Relational Mapping)组件,用于帮助开发者快速操作数据库。在本文档中,我们将在下一节中安装Symfony ORM组件来操作项目数据库。 本文档主要介绍了...
5. **数据库模型**:可能有ORM(Object-Relational Mapping)文件,如 Doctrine,用于处理与数据库的交互。 6. **样式表和脚本**:CSS文件用于样式设计,JavaScript文件可能包含Vue.js应用之外的辅助脚本。 通过...
3. **Doctrine ORM**:Sylius使用Doctrine与数据库进行交互,你需要熟悉Object-Relational Mapping(ORM)的概念以及如何创建和操作数据模型。 4. **Twig模板引擎**:用于前端展示,你需要学习如何编写和理解Twig...
实体类可以通过使用 Doctrine ORM(Object-Relational Mapping)工具来定义,它允许我们将数据库操作转换为面向对象的代码。之后,我们可以创建一个控制器,处理POST请求,将用户提交的数据保存到数据库中。 **读取...
- **数据库操作简化**:框架提供了强大的ORM(Object-Relational Mapping)支持,使得开发者可以通过简单的API来进行数据库操作,无需编写复杂的SQL语句。 - **灵活的许可协议**:CakePHP采用MIT许可证,这意味着它...
ORM,全称Object-Relational Mapping,是一种编程技术,用于将关系数据库的数据映射到对象上,使得开发者可以用面向对象的方式来操作数据库。在PHP中,ORM框架如Doctrine、Eloquent等,大大简化了数据库交互的过程,...
- ORM(Object-Relational Mapping):如Doctrine,提供面向对象的方式来操作数据库。 4. PHP框架: - Laravel:流行的MVC框架,提供了强大的路由、中间件、Eloquent ORM等功能。 - Symfony:组件化的框架,适用于...
5. **实体(Entity)**:在Symfony与ORM(Object-Relational Mapping)如 Doctrine 配合时,实体是用来表示数据库表的类,允许以面向对象的方式操作数据。 6. **表单(Form)**:Symfony提供了强大的表单组件,可以轻松...