Entity framework 我可以在不将实体连接到数据库表的情况下使用ORM吗
我有一个实体,它从REST web服务中提取数据。为了与我的应用程序中从数据库中提取数据的实体保持一致,我使用了ORM并覆盖了存储库中的find函数 我的问题是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,我应该把数据
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()。如果需要,您仍然可以扩展条令的实体存储库基类,在这种情况下,您需要注册它们以由工厂创建(条令将是工厂)。或者你可以按照我在回答中提出的方法,只将实体经理注入你的回购协议中。