Doctrine 2.x CRUD

时间:2011-11-19 19:43:07

标签: php codeigniter doctrine-orm

我听说过很多关于ORM Doctrine的好东西。我可以使用像http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup这样的优秀教程来学习Doctrine,但是它已经过时并使用了Doctrine 1.x.我更喜欢立即学习Doctrine 2.x以节省时间。

我设法将Doctrine 2.1与Codeigniter 2.0.3结合使用。我已经设法做了一些基本的操作,比如添加新对象并将它们保存到数据库中。现在我正在尝试一些不应该太困难的事情,但我花了很长时间才找到如何做到以下几点:

如果我想使用$ _POST数据创建一个对象,我不想在代码中单独分配每个属性。我更喜欢像$ u-> fromArray这样的东西,例如如

所示
$data = array(
'username' => 'myuser',
'password' => 'mypass',
'email' => 'my@email.com'
);

$u = new User();
$u->fromArray($data);
$u->save();

来源:http://www.phpandstuff.com/articles/codeigniter-doctrine-day-5-database-crud

然而,在Doctrine 2.x中不再存在fromArray()。在Doctrine 2.x中是否存在fromArray()的等价物?

第二个问题:我觉得很难开始。官方文件主要侧重于学说。有一个实际的例子,包括表单验证,crud操作等,这将是非常好的。使用Doctrine 2有一个MVC示例项目是非常好的。有没有人知道这样的教程或示例项目?

3 个答案:

答案 0 :(得分:1)

答案实际上取决于你。你的实体只是普通的PHP对象 - 因此你可以自己教授技巧(比如实现fromArray()方法),或者围绕它们建立基础设施。

某些选项,可能适合或不适合您的用例:

  • 为填充属性的实体编写构造函数:new Article($title, $author, $abstract, $body)new Article($arrayOrObject)
  • 编写静态工厂方法
  • 编写自己的fromArray()实现
  • 在一个抽象类中编写自己的fromArray()实现,所有实体都会继承,并可能根据需要覆盖

答案 1 :(得分:0)

在我看过的每个例子中,根据我使用Doctrine2编写代码的经验,从$ _POST数据创建对象的正确方法是使用实​​体类中的setter单独设置每个属性。

fromArray()当然看起来很方便,但是知道Doctrine2如何处理关联,我看不到它让你走得很远。

关于Doctrine2的一个好的CRUD教程,你可能会喜欢“使用Zend Framework的Easy PHP网站”一书中的这个sample chapter。这本书本身是在ZF而不是CodeIgniter上,但样本章节中只有Zend特有的。但是,您可能更愿意远离z2d2示例存储库。

除此之外,本网站还有许多适用于CRUD环境的Doctrine2上有用的问题和答案。继续发帖,我确信我或其中一位其他人可以提供帮助。

答案 2 :(得分:0)

您可以使用某些第三方Doctrine模块(如DoctrineModule)将数组转换为对象,而不是实现fromArray()或populate()。例如,您可以执行以下操作:

use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;

$hydrator = new DoctrineHydrator($objectManager);

$data = array(
    'username' => 'myuser',
    'password' => 'mypass',
    'email' => 'my@email.com'
);

$user = new User();
$user = $hydrator->hydrate($data, $user);

$em->persist($user);
$em->flush();