8

我正在尝试实践一个好的设计和扩展 Doctrine 实体。我的扩展类,基本上是模型,将有额外的业务逻辑+对实体基本数据的访问。

我正在使用 Doctrine 2.2.1 & Zend Framework 1.11.4 & php 5.3.8

当我使用 DQL 时,学说成功返回模型实体。当我使用 Doctrine 本机 find() 函数时,它什么也不返回:(。

帮助...

它是这样滚动的:

引导程序.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);

作品

$qry = $qb
        ->select('u')
        ->from('Models\User','u'); 
4

3 回答 3

4

您不应该将业务逻辑添加到实体中,而应该使用模型来代替。一种方法是:

  1. 将模型用于业务逻辑。
  2. 为您的所有数据库查询(DQL 或其他)[1] 创建自定义 Doctrine 2 存储库。
  3. 别管你的实体。

在实践中,这意味着模型是普通的 PHP 类(或者可能是框架扩展,具体取决于您使用的内容),但您的模型与您的数据库无关。但是,您的模型会实例化您的自定义 Doctrine 2 存储库。例如 aUserRepository可能包含一个名为 的方法getUserById。在您的存储库中,您可以运行实际查询并返回实体实例以供模型使用。

[1] http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#custom-repositories

于 2013-08-07T02:34:16.543 回答
1

据我了解,DoctrineentityManager仅负责持久实体,并且扩展Entities\User实体Model\User将创建另一个实体(存储在 docblock 中所述的同一表中),但不由它管理entityManager或与之冲突,因为您可能没有@InheritanceType("SINGLE_TABLE")Entities\Userdocblocks 中提及:

阅读此文档以获取更多信息http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

于 2012-08-29T14:30:21.020 回答
0

我试图做的是一种不好的做法。正如@Ivan Hušnjak 提到的,我将我的数据库实体和来自zend 的工具耦合在一起。

应该做的是解耦。

业务逻辑应该在 services\controller 中,这些应该针对实体及其方法。您可以\应该将辅助函数添加到与实体属性相关的学说实体。

关于我的主要目的(拥有一个 Doctrine CLI 可以重写和更新的实体类):教义只搜索本地字段\方法中的更改,相应地更新它们并丢弃所有其他功能(帮助程序)。所以让学说更新php实体是没有问题的!

ps移动到symfony2。

于 2013-02-05T12:15:09.750 回答