Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 我可以在不将实体连接到数据库表的情况下使用ORM吗_Entity Framework_Symfony_Orm_Doctrine Orm - Fatal编程技术网

Entity framework 我可以在不将实体连接到数据库表的情况下使用ORM吗

Entity framework 我可以在不将实体连接到数据库表的情况下使用ORM吗,entity-framework,symfony,orm,doctrine-orm,Entity Framework,Symfony,Orm,Doctrine Orm,我有一个实体,它从REST web服务中提取数据。为了与我的应用程序中从数据库中提取数据的实体保持一致,我使用了ORM并覆盖了存储库中的find函数 我的问题是ORM似乎需要一个数据库表。当我运行doctrine:schema:update时,它抱怨需要实体索引,然后当我添加索引时,它会为实体创建一个表。我想这在将来会是一个问题,因为ORM希望查询数据库而不是web服务 所以。。。我做错了吗 1、如果我继续使用ORM,我如何才能让它不再需要单个实体的数据库表 2、如果我忘记了ORM,我应该把数据

我有一个实体,它从REST web服务中提取数据。为了与我的应用程序中从数据库中提取数据的实体保持一致,我使用了ORM并覆盖了存储库中的find函数

我的问题是ORM似乎需要一个数据库表。当我运行
doctrine:schema:update
时,它抱怨需要实体索引,然后当我添加索引时,它会为实体创建一个表。我想这在将来会是一个问题,因为ORM希望查询数据库而不是web服务

所以。。。我做错了吗

1、如果我继续使用ORM,我如何才能让它不再需要单个实体的数据库表

2、如果我忘记了ORM,我应该把数据加载函数放在哪里?我可以在不使用ORM的情况下将实体连接到存储库吗

所以。。。我做错了吗

是。如果你真的不想使用ORM,那么使用ORM接口是没有意义的

我认为最好的办法是根本不考虑实施细节。介绍您自己的存储库接口:

接口产品
{
/**
*@param字符串$slug
*
*@退货产品[]
*/
公共功能findBySlug($slug);
}
接口命令
{
/**
*@param Product$Product
* 
*@returnorder[]
*/
公共功能findProductOrders(产品$Product);
}
并使用ORM实现它们:

类DoctrineProducts实现产品
{
私人股本$em;
公共函数构造(EntityManager$em)
{
$this->em=$em;
}
公共函数findBySlug($slug)
{
返回$this->em->createQueryBuilder()
->选择()
// ...
}
}
或Rest客户端:

类恢复程序实现订单
{
私有$httpClient;
公共函数构造(HttpClient$HttpClient)
{
$this->httpClient=$httpClient;
}
公共功能findProductOrders(产品$Product)
{
$orders=$this->httpClient->get(sprintf('/product/%d/orders',$product->getId());
$orders=$this->hydrateResponseToOrdersInSomeWay($orders);
退回$orders;
}
}
您甚至可以让一些方法使用http客户机,一些方法使用单个存储库中的数据库

将存储库注册为服务并使用它们,而不是直接调用
原则::getRepository()

services:
    repository.orders:
        class: DoctrineOrders
        arguments:
            - @doctrine.orm.entity_manager
始终依赖于存储库接口,而不是特定的实现。换句话说,始终使用存储库接口类型提示:

class-DefaultController
{
私人美元订单;
公共函数构造(订单$Orders)
{
$this->orders=$orders;
}
公共功能索引(产品$Product)
{
$orders=$this->orders->findProductOrders($product);
// ...
}
}
如果未将控制器注册为服务:

类DefaultController扩展控制器
{
公共功能索引(产品$Product)
{
$orders=$this->get('repository.orders')->findProductOrders($product);
// ...
}
}
这种方法的一个巨大优势是,您可以随时在以后更改实现细节。Mysql不再适合搜索了?让我们使用弹性搜索,它只是一个存储库


如果您需要在后台调用$product->getOrders()并从API获取订单,那么在doctrine的延迟加载和事件侦听器的帮助下,仍然可以实现。

因此,使用MVC时,恢复程序和DoctrineProducts类与我编写的覆盖ORM函数相同。我只需要根据需要包含和创建它们,而不是使用$em->getRepository()函数来加载它们。订单实体不需要知道它正在由RestOrders存储库管理。是吗?是的,将您的存储库注册为服务并使用它们,而不是Doctrine::getRepository()。如果需要,您仍然可以扩展条令的实体存储库基类,在这种情况下,您需要注册它们以由工厂创建(条令将是工厂)。或者你可以按照我在回答中提出的方法,只将实体经理注入你的回购协议中。