ZF2:无法在“应用程序\实体\#用户”中找到目标实体。

时间:2014-03-13 13:31:49

标签: php orm doctrine-orm zend-framework2 entity

我正在使用Zend Framework 2和Doctrine2。 我使用User和Project实体。用户可以拥有更多项目,项目可以拥有多个用户。所以我使用另一个实体User_Project。 它们都已设置好,我已经验证了架构。所有映射文件都是正确的,并且数据库架构是同步的(orm:validate-schema)。 当我尝试获取所有用户时,我收到一条错误,指出无法找到目标实体(请参阅标题)。当我尝试获得一个用户时出现相同的错误。

错误

  

在“Application \ Entity \ User#user”中找不到目标实体Application \ Entity \ User_Project。

控制器:

return $this->getEntityManager()->getRepository('Application\Entity\User')->findAll();

用户实体     

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/** @ORM\Entity 
*   @ORM\Table(name="user")
**/
class User {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="user_id")
*/
protected $user_id;

/** @ORM\Column(type="string") */
protected $fullName;

/** @ORM\OneToMany(targetEntity="User_Project", mappedBy="user") */
protected $user;

public function getUserId()
{
    return $this->user_id;
}

public function getFullName()
{
    return $this->fullName;
}

public function setFullName($value)
{
    $this->fullName = $value;
}
}

项目实体     

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/** @ORM\Entity 
@ORM\Table(name="project")
**/

class Project {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="project_id")
*/
protected $project_id;

/** @ORM\Column(type="string") */
protected $customer;

/** @ORM\Column(type="string") */
protected $project_name;

/** @ORM\OneToMany(targetEntity="User_Project", mappedBy="project") */
private $project;

public function getProjectId()
{
    return $this->project_id;
}

}

User_Project实体

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/** @ORM\Entity 
*   @ORM\Table(name="user_project")
**/
class User_Project {

/** 
 * @ORM\Id()
 * @ORM\ManyToOne(targetEntity="User", inversedBy="user") 
 * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id", nullable=false) 
 */
protected $user;

/** 
 * @ORM\Id()
 * @ORM\ManyToOne(targetEntity="Project", inversedBy="project") 
 * @ORM\JoinColumn(name="project_id", referencedColumnName="project_id", nullable=false) 
 */
protected $project;


public function getUser()
{
    return $this->project;
}

public function getProject()
{
    return $this->user;
}

public function setUser($value)
{
    $this->user = $value;
}

public function setProject($value)
{
    $this->project = $value;
}
}

Modules.php

namespace Application;

use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;

class Module
{
public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

public function getConfig()
{
    return include __DIR__ . '/config/module.config.php';
}

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}
}

2 个答案:

答案 0 :(得分:1)

可能在Module.php或module.config.php中定义您的实体是错误的。 请复制Module.php或module.config.php

module.config.php中的正确定义:

return array(
'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
))))),
用户实体中的

可能更好地将用户属性重命名为userProjects或项目,并对User_Project上的关系定义应用更改

答案 1 :(得分:0)

检查数据库中的列名。如果你想要正确的数据库。我推荐用于create db的模式工具。

$tool = new \Doctrine\ORM\Tools\SchemaTool($this->getEntityManager());
$classes = array(
     $this->getEntityManager()->getClassMetadata('Application\Entity\User'),
     $this->getEntityManager()->getClassMetadata('Application\Entity\Project'),
     $this->getEntityManager()->getClassMetadata('Application\Entity\User_Project'),
);

$tool->dropSchema($classes);
$tool->createSchema($classes);

在控制器或其他地方。