我正在努力练习一个好的设计并扩展Doctrine实体。 我的扩展类(基本上是模型)将具有额外的业务逻辑+访问实体基本数据。
我正在使用Doctrine 2.2.1& Zend Framework 1.11.4& php 5.3.8
当我使用DQL时,doctrine成功返回Model实体。 当我使用Doctrine native find()函数时,它什么都不返回:(。
... HELP
bootstrap.php中:
$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH.'/doctrine');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Models', APPLICATION_PATH);
$classLoader->register();
APPLICATION_PATH \ models \ User.php中的模型:
namespace Models;
use Doctrine\ORM\Query;
/**
* Models\User
*
* @Table(name="user")
* @Entity
*/
class User extends \Entities\User {
public function __wakeup() {
$this->tools = new Application_App_Tools();
}
实体检索功能:
不工作 :
$userEntity = $registry->entityManager->find('Models\User', $userEntity);
的 WORKS :
$qry = $qb
->select('u')
->from('Models\User','u');
答案 0 :(得分:4)
您不应该将业务逻辑添加到实体,而应该使用模型。一种方法是:
实际上,这意味着模型是普通的PHP类(或者可能根据您使用的内容扩展框架),但您的模型与您的数据库无关。但是,您的模型会实例化您的自定义Doctrine 2存储库。例如。 UserRepository
可能包含名为getUserById
的方法。在您的存储库中,您可以运行实际查询并返回实体实例以供模型使用。
[1] http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#custom-repositories
答案 1 :(得分:1)
据我了解Doctrine,entityManager
仅对持久性实体负责,并且使用Entities\User
扩展Model\User
实体将创建另一个实体(存储在docblock中所述的相同表中),但是不是由entityManager
管理或与其发生冲突,因为您可能未在@InheritanceType("SINGLE_TABLE")
docblocks中提及Entities\User
:
阅读此文档了解更多信息http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
答案 2 :(得分:0)
我试图做的是一种不好的做法。 正如@IvanHušnjak提到的那样,我将我的数据库实体和工具与zend结合起来。
应该做的是解耦。
业务逻辑应该在服务\控制器中,这些应该解决实体及其方法。 你可以\应该将辅助函数添加到仅与实体属性相关的学说实体。
关于我的主要目的(要有一个Doctrine CLI可以重写和更新的实体类): doctrine只搜索本机字段\方法中的更改,相应地更新它们并丢弃所有其他函数(帮助程序)。所以当让doctrine更新php实体时没有问题!
P.S。 转到symfony2。