我一直在尝试找到一个实体类的示例,以确保我应该在其中放入什么。有人可以举个例子来说明这样的班级会是什么样子吗?
-
这个对象应该只包含数据,就像我可以简单地使用 StdClass 对象一样吗?或者它也应该包含我的 CRUD 方法?(创建、读取、更新、删除)
-
为数据库或模型中的每一行创建实体类的实例是否是一种好方法,或者我应该使用一个实体类并将所有不同的行保存在实体类的数组属性中?
在我的上一个项目中,我将实体和映射器(CRUD 操作)分开,因此它看起来像这样:
实体
Class PostEntity
{
public $title;
public $text;
}
映射
Class PostMapper
{
public function load($id)
{
// load one record from Database where id = $id
}
public function save()
{
// insert new record or edit in Database
}
public function delete()
{
// delete from Database
}
}
用法 - 1 个实体
$postMapper = new PostMapper();
$post = $postMapper->load(1); // load from Database where post_id = 1
$post->title = "New title"; // set new post title
$postMapper->save($post); // edit post in Database
用法 - 多个实体
$postMapper = new PostMapper();
$posts = $postMapper->loadAllFromCategory(2); // load from Database where cateogory_id = 1
foreach ($posts as $post) {
echo "<h3>" . $post->title . "</h3>";
}
因此,在我的示例中,实体是变量(数据库表中的列)和setter/getter(可选)的"愚蠢"集合,而Mapper则完成所有数据库工作(CRUD)。如果我想更改映射器以从外部XML获取结果,我只需创建PostMapperXml类以从XML加载数据。
正如评论者所指出的那样,使用 MVC 框架将是轻松进入事物的最佳方式。或者使用Doctrine2 - ORM的广告列表(它将PHP类映射到数据库表并为您执行所有查询)。
但要回答你的问题:
-
对于每个实体(表),它应该是不同的类。它应该包含广告列表 CRUD 方法,但可以包含其他与数据相关的方法("文章"实体可能包含 getBodyLinks() 方法,该方法将解析正文并返回所有 URL。
-
每个实体都是...嗯一个实体。如果您出于某种原因不希望大量对象实例漂浮在周围,那么您应该比实体更"低级"。
Symfony2 + Doctrine2 示例:
https://github.com/stfalcon/BlogBundle/blob/master/Entity/Post.php
(这只是我在 github 上找到的一些随机存储库)