Symfony2/Doctrine - 与普通 SQL 相关的实体抽象
Posted
技术标签:
【中文标题】Symfony2/Doctrine - 与普通 SQL 相关的实体抽象【英文标题】:Symfony2/Doctrine - Entity Abstraction in Relation to Normal SQL 【发布时间】:2013-12-11 01:22:05 【问题描述】:我是 Symfony2 的新手,我正在基于现有的遗留 mysql 架构构建应用程序。我已经熟悉了所有介绍文档(The Book 等),但仍然需要了解如何正确使用框架的一些更高级别的概念。试图根据我通常如何编写 SQL 查询来了解实体的概念。我使用 CLI 为所有现有表生成实体。例如……已经有一个 Clients 和一个 Titles 实体。标题由客户“拥有”,核心 Symfony 注释已正确映射它们。
因此,给定一个包含许多值列但只有一个titles.client_id 的titles 表...假设我想在ClientsController 中创建一个表单操作(clients.yml 路由:/clients/id/add_title)对于 url 中给定的客户端 ID,将允许用户输入标题名称并将新记录保存到仅包含 title.name 和 title.client_id 值的标题中......真的很简单。
我的问题是......在定义这个非常简单的查询时(在普通 SQL 中)
INSERT INTO (titles) VALUES (name, client_id)
我是否需要为标题创建另一个实体才能使用这两个特定值?
或
将实体的一部分用于特定存储库的理想方式是什么……在这种情况下,只是titles 表的一个子集(name & client_id)?
这是我的客户端控制器中的 Action 方法:
//use Entity & Form namespaces for BOTH tables;
public function addTitleAction(Request $request)
$client_entity = new Clients;
$titles_entity = new Titles;
// generate simple 2 input form with Form\TitlesType
return etc ...
您可能会说,我还需要弄清楚如何使用表单类,但我的基本问题是如何从较大的实体生成简单查询以及如何从另一个实体/表控制器的控制器调用.谢谢你的帮助。
【问题讨论】:
您不应该在控制器中使用其他控制器,而是要使用对象(实体)。您不应该调用另一个控制器的方法,而是调用实体(或实体存储库)的方法。 所以你说这个动作应该在 TitlesController 中,好的,我明白了。让我试试。当我处理更复杂的查询时,仍然可以使用更一般的解释。谢谢 哦,等等,我看到标题归客户所有。您可以在学说实体配置中设置关系。如果您使用的是 CLI 工具,它可能位于 src/BundleName/resources/config/doctrine/Entityname.yml 中,那么您只需像 webbiedave 在他的回答或 $client->setTitle($title); 中所说的那样做而是 【参考方案1】:要想了解新概念,请将实体视为从表中返回的一行。将存储库视为您对表的查询。所以你应该有一个Title
实体(不是Titles
)。
INSERT INTO (titles) VALUES (name, client_id)
我是否需要为标题创建另一个实体才能与这些标题一起使用 2 个具体值?
在创建新记录时,您需要创建一个新对象(将新对象视为您随后保存的新记录),如下所示:
$title = new Title();
$title->setClient($client);
$em->persist($title);
【讨论】:
以上是关于Symfony2/Doctrine - 与普通 SQL 相关的实体抽象的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 / Doctrine2:不要在模式上删除全文索引:更新
如何从 Symfony2 和 Doctrine2 中的一个点保存和检索纬度和经度