搜索

首页  >  问答  >  正文

改用symfony2.0开发项目,想提点问题

我之前用symfony1.4+propel开发项目,现在改用symfony2.0了,但没用过doctrine,但官方默认doctrine并去掉propel了。
1.使用doctrine有什么优势呢?相对于propel来说。项目是系统方面。
2.用propel时,发现group by 不是很好用,是吗?
3.doctrine应对多对多M:N关系时,处理得如何?

另外,我贴出doctrine可能出现的问题,我是参考别人的:
1.文档错误,要用options配置字段额外选项,比如 unsigned、default属性,官方文档、生成的yml都是直接在字段上指定。
2.外键无法指定unsigned、default
3.表关系是non-identifying relationship

感谢!

某草草某草草2785 天前532

全部回复(1)我来回复

  • 怪我咯

    怪我咯2017-05-16 16:48:03

    “标准的”Doctrine所支持的功能,是PDO所支持的各关系型数据库(MySQL,PostgrelSql等)都具备的功能的集合,也就是说,所有A支持而B不支持的,Doctrine默认都不包含,但Doctrine有良好的扩展性和丰富的第三方代码,Baidu里怎么搜不知道,Google里搜Doctrine+Extensions,会有很多收获。

    Doctrine多对多的支持还不错,够用。

    在Symfony 2里你还是可以用Propel,官网上文档里有专门的一章。

    Doctrine和Propel都不错(自己写数据库封装,也可以是好同志),各选各好吧,非要比较的话,可以举一些客观的区别:

    1. Doctrine是Data Mapper+Proxy模式,Propel是Active Record模式(这是个哲学问题);
    2. Doctrine的社区更活跃;
    3. Symfony 2使用Doctrine的Common库来实现的基于注解(annotation)的依赖注入(DI);
    4. Doctrine更现代一些(2.x),对PHP 5.3+的特性支持更好,但Propel也在赶上。

    如前述,你所说的unsigned,这个特性不能跨数据库,自然也就没有被默认支持,但如果需要,办法很多,不在此答案中罗嗦。

    default也不是能跨数据库的属性,但你可以在Doctrine的Entity类里,为做了映射的成员变量,定义一个默认值就可以了,夫复何求?

    Doctrine的承诺就是跨库通用,我认为好的代码就是只做自己承诺的事,从这一点出发,Doctrine还是可以让人放心的。毕竟还有很多人在用PostgreSql或者SQLite,不要用MySQL的思维去强求一致。

    回复
    0
  • 取消回复