doctrine-orm 相关问题

Doctrine ORM是一个PHP ORM。虽然Doctrine 1.2使用Active Record模式,但Doctrine ORM 2及更高版本使用Data Mapper模式。 Doctrine项目是一个开源库和工具的集合,用于处理用PHP编写的数据库抽象和对象关系映射。

Symfony/FosUserBundle - 在数据库中存储角色

如何在数据库中存储角色? 我尝试了这种方法http://blog.jmoz.co.uk/symfony2-fosuserbundle-role-entities/ 用户.php /** * @ORM\实体 * @ORM\Table(名称=“`用户`”) */ User 类扩展了 BaseU...

回答 1 投票 0

如何阻止学说尝试为已映射到实体上的视图创建表?

如何阻止 symfony 尝试为我在学说迁移中创建的视图创建表? 实体映射视图 /** * 类 TenancyPendingInspection * @ORM\Entity(repositoryClass="

回答 4 投票 0

编写功能测试时将会话中的用户附加到当前EntityManager

我正在为与用户实体有关系的操作实体编写功能测试: 我正在为与 Action 实体有关系的 User 实体编写功能测试: <?php namespace Acme\AppBundle\Entity; /** * Class Action * * @ORM\Table() * @ORM\Entity(repositoryClass="Acme\AppBundle\Repository\ActionRepository") */ class Action { /** * @var int * * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var \Acme\AppBundle\Entity\User * * @ORM\ManyToOne(targetEntity="\Acme\AppBundle\Entity\User", inversedBy="actions") * @ORM\JoinColumn(name="user_id", referencedColumnName="id") */ private $createdBy; } 用户: namespace Acme\AppBundle\Entity; /** * @ORM\Entity * @ORM\Table(name="`user`") */ class User extends BaseUser { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var ArrayCollection * * @ORM\OneToMany(targetEntity="Action", mappedBy="createdBy") */ private $actions; } 用户使用以下代码片段在控制器中设置: <?php namespace Acme\ApiBundle\Controller; /** * * @Route("/actions") */ class ActionController extends FOSRestController { public function postAction(Request $request) { $action = new Action(); $action->setCreatedBy($this->getUser()); return $this->processForm($action, $request->request->all(), Request::METHOD_POST); } } 例如,当使用 REST 客户端调用操作时,一切正常,Action 和 User 之间的关系正确保留。 现在,当使用功能测试来测试操作时,由于以下错误,该关系不起作用: 通过关系“Acme\AppBundle\Entity\Action#createdBy”找到了一个新实体,该实体未配置为实体的级联持久操作:测试。要解决此问题:对此未知实体显式调用 EntityManager#persist() 或配置级联在映射中保留此关联,例如 @ManyToOne(..,cascade={"persist"})。 对于我的功能测试,我需要注入 JWT 和会话令牌,因为我的路由由 JWT 保护,并且我需要在会话中拥有用户。 这是我注入的方法: <?php namespace Acme\ApiBundle\Tests; class ApiWebTestCase extends WebTestCase { /** * @var ReferenceRepository */ protected $fixturesRepo; /** * @var Client */ protected $authClient; /** * @var array */ private $fixtures = []; protected function setUp() { $fixtures = array_merge([ 'Acme\AppBundle\DataFixtures\ORM\LoadUserData' ], $this->fixtures); $this->fixturesRepo = $this->loadFixtures($fixtures)->getReferenceRepository(); $this->authClient = $this->createAuthenticatedClient(); } /** * Create a client with a default Authorization header. * * @return \Symfony\Bundle\FrameworkBundle\Client */ protected function createAuthenticatedClient() { /** @var User $user */ $user = $this->fixturesRepo->getReference('user-1'); $jwtManager = $this->getContainer()->get('lexik_jwt_authentication.jwt_manager'); $token = $jwtManager->create($user); $this->loginAs($user, 'api'); $client = static::makeClient([], [ 'AUTHENTICATION' => 'Bearer ' . $token, 'CONTENT_TYPE' => 'application/json' ]); $client->disableReboot(); return $client; } } 现在,问题是注入的 UsernamePasswordToken 包含一个与当前 User 分离的 EntityManager 实例,从而导致上面的 Doctrine 错误。 我可以将 $user 方法中的 postAction 对象合并到 EntityManager 中,但我不想这样做,因为这意味着我修改我的工作代码以使测试通过。 我还尝试将测试中的 $user 对象直接合并到 EntityManager 中,如下所示: $em = $client->getContainer()->get('doctrine')->getManager(); $em->merge($user); 但它也不起作用。 所以现在,我陷入了困境,我真的不知道该怎么办,除了我需要将会话中的用户附加回当前EntityManager。 您收到的错误消息表明测试客户端容器中包含的 EntityManager 不了解您的 User 实体。这让我相信您在 createAuthenticatedClient 方法中检索 User 的方式是使用不同的 EntityManager。 我建议您尝试使用测试内核的 EntityManager 来检索 User 实体。例如,您可以从测试客户端的容器中获取它。 感谢您的推文,我来完成给定的答案并(尝试)提出解决方案, 问题是您的用户不受 EntityManager 管理,更简单地说,因为它不是在数据库中注册的真实现有用户。 要解决此问题,您需要有一个真正的(托管)用户,该规则可以用于您的操作试图创建的关联。 因此,您可以在每次执行功能测试用例时创建此用户(并在完成后将其删除),或者仅在新环境中首次执行测试用例时创建一次。 这样的事情应该可以解决问题: /** @var EntityManager */ private $em; /** */ public function setUp() { $client = static::createClient(); $this->em = $client->getKernel() ->getContainer() ->get('doctrine'); $this->authClient = $this->createAuthenticatedClient(); } /** */ protected function createAuthenticatedClient() { /** @var User $user */ $user = $this->em ->getRepository('Acme\AppBundle\Entity\User') ->findOneBy([], ['id' => DESC]; // Fetch the last created // ... return $client; } 这对你的灯具来说是一个遗憾(它们太性感了),但我看不到任何方法可以将你的灯具作为真正的入口附加起来,因为你无法与测试的控制器进行更多交互。 另一种方法是向您的登录端点创建请求,但这会更难看。

回答 2 投票 0

带有“$fetchJoinCollection = true”的分页器不会遵守 DQL 中的“ORDER BY”?

有一个奇怪的问题。我们正在使用 MariaDB 5.5 和doctrine/orm 2.3.3,并尝试将 Doctrine Paginator 与 DQL 结合使用。 http://docs.doctrine-project.org/en/latest/tutorials/pagination.html 该...

回答 1 投票 0

如何以通用方式处理过滤器的会话存储,避免“实体必须被管理”

当我们尝试 setFilters() / getFilters() 时,我们都遇到过这个问题:“实体必须被管理” 那么如何以通用的方式处理过滤器的会话存储,以便......

回答 1 投票 0

Zf2 列出实体原则 2 中的要素

我有一个简单的问题, 如何创建表单列表元素,例如网格或以下内容: [x] 姓名 |图像| [按钮] [ ] 姓名 |图像| [按钮] [x] 姓名 |图像| [按钮] 我有一个简单的问题, 我如何创建表单列表元素,例如网格或这样: [x] name | image | [button] [ ] name | image | [button] [x] name | image | [button] <table> <tr><th>checkbox</th><th>name</th><th>action</th></tr> <tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr> <tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr> <tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr> </table> //列出数据库中的实体,数组(对象,对象,对象) //对象=应用程序\实体\区域 $areas = $this->getObjectManager()->getRepository('Application\Entity\Area')->findAll(); 我在表单 Zend\Form\Element\Collection 中使用,但我不知道如何从数据库填充集合日期,所以我有清晰的表单。 我应该正确做,用什么? 从 Doctrine 中你已经得到了一个可迭代的数据类型(数组)。所以你只需要在你的视图中迭代它: ... <?php foreach($this->data as $area): ?> //your table row markup for a single entity <?php endforeach; ?> ... 免责声明:我问过类似的问题,但没有答案。所以我也很想知道“Zend”方式,或者是否有人能够提出替代方案。 下面的方法似乎对我有用。 ListForm.php 将集合添加到您的“列表”表单中。 /** The collection that holds each element **/ $name = $this->getCollectionName(); $collectionElement = new \Zend\Form\Element\Collection($name); $collectionElement->setOptions(array( 'count' => 0, 'should_create_template' => false, 'allow_add' => true )); $this->add($collectionElement); 这个集合将容纳集合元素(Zend\Form\Element\Checkbox) /** The element that should be added for each item **/ $targetElement = new \Zend\Form\Element\Checkbox('id'); $targetElement->setOptions(array( 'use_hidden_element' => false, 'checked_value' => 1, )); $collectionElement->setTargetElement($targetElement); 然后我添加了一些方法来允许我将 ArrayCollecion 传递到表单。对于我的集合中的每个实体,我将创建一个新的 $targetElement;将其检查值设置为实体的 id。 /** * addItems * * Add multiple items to the collection * * @param Doctrine\Common\Collections\Collection $items Items to add to the * collection */ public function addItems(Collection $items) { foreach($items as $item) { $this->addItem($item); } return $this; } /** * addItem * * Add a sigle collection item * * @param EntityInterface $entity The entity to add to the * element collection */ public function addItem(EntityInterface $item) { $element = $this->createNewItem($item->getId()); $this->get($this->getCollectionName())->add($element); } /** * createNewItem * * Create a new collection item * * @param EntityInterface $entity The entity to create * @return \Zend\Form\ElementInterface */ protected function createNewItem($id, array $options = array()) { $element = clone $this->targetElement; $element->setOptions(array_merge($element->getOptions(), $options)); $element->setCheckedValue($id); return $element; } 然后需要的就是将集合从控制器操作内传递到表单。 一些控制器 public function listAction() { //.... $users = $objectManager->getRepository('user')->findBy(array('foo' => 'bar')); $form = $this->getServiceLocator()->get('my_list_form'); $form->addItems($users); //... } 您可以使用数据库中的学说填充多选复选框,使用 DoctrineModule\Form\Element\ObjectMultiCheckbox,如本页所示: https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md 只需将实体管理器传递给表单,然后按照示例中的操作即可创建 ObjectMultiCheckbox 表单元素... 或其他更好的 -moro 自动化工作方法,如果您想使用集合,您需要对区域进行正确的映射(@orm\OneToMany 和 @orm\ManyToOne)...并在形式如下...: http://framework.zend.com/manual/2.2/en/modules/zend.form.collections.html 并向其他实体添加方法以添加和删除区域,如下所示: public function addArea(Collection $areas) { foreach ($areas as $area) { $area->setOtherEntity($this); $this->areas->add($area); } } public function removeAreas(Collection $areas) { foreach ($areas as $area) { $area->setOtherEntity(null); $this->areas->removeElement($area); } } 如果您使用水合作用,当您自动选择它们时,这些值将被添加和删除...

回答 3 投票 0

graphql 中的 Post 请求返回数据字段,但它们的值为空

我制作了一个 graphql 控制器,它可以从原则中解析有关类别的信息。当我在终端输入以下命令时,问题就开始了: 卷曲 -X POST http://localhost:8000/graphq...

回答 1 投票 0

Symfony ParamConverter 到 MapEntity

我正在尝试将我的symfony应用程序从版本5.4升级到6.4,因为Sensio Bundle已被放弃,我需要使用属性而不是注释,我如何将paramcoverter注释转换为

回答 1 投票 0

在学说中扩展实体的最佳方式

我在我制作的一个小框架中有一个用户实体。现在我想在几个项目中使用这个用户实体。 但在某些项目中我想向用户实体添加一些字段而不修改...

回答 1 投票 0

使用 DoctrineExtensios 更新 slug 创建的另一个字段

我在 Symfony 2 项目中使用 DoctrineExtensions,我有一个简单的实体类,其中我在属性上使用 Sluggable,然后我想根据 slug 将值设置为另一个属性,...

回答 2 投票 0

如何使用Doctrine 2中的OneToMany关系更新记录?

我有一个用户实体,我正在尝试从 UserService 更新它。当我尝试更新设置为数组集合的属性时,问题就出现了。 /** * * @param \Doctring\Common\Colle...

回答 2 投票 0

如何在 FormType 中使用 Repository 自定义函数

我面临的问题是我必须以包含所有父实体(类别实体)的形式创建一个选择框。现在我设法做到这一点: $builder->add('父级', '实体', 数组( ...

回答 2 投票 0

外键/连接列和连接表不是由 Symfony 5+ 中的 Doctrine 创建的

在标题中我提到了外键和联接表。在这种情况下,首先,我关心的是外键。但无论如何,联接表只是表中的多个外键。看来...

回答 1 投票 0

摆脱复杂实体关系的循环引用(Symfony 6.4)

当我想要规范化对象宽度 ObjectNormalizer 和 Serializer 时,我的应用程序中有一个循环引用错误,但我无法摆脱它。 我已经这样做过好几次了,但是这个应用程序更方便......

回答 1 投票 0

Symfony / Doctrine - 按儿童和家长类别显示数据库中的产品

我创建了自引用类别实体,与类别实体具有多对多关系的产品实体。 类别列表示例: MacBook -MacBook Air --MacBook Air 11 --MacBook Air 13 -M...

回答 1 投票 0

如何将自定义属性添加到 Symfony Doctrine YAML 映射文件

谁能告诉我如何向 ORM yml 文件添加自定义属性? 我的想法是添加这样的属性: 字段: 姓名: 类型:字符串 可本地化:true 那我想...

回答 2 投票 0

Symfony2:如何在执行登录检查之前更改实体管理器

我有两个 dbal 连接。一种是静态的,在 config.yml 中定义,另一种是动态定义的。当我在控制器中需要它时,我设置连接参数,例如主机、数据库名称、密码等......

回答 1 投票 0

Symfony+doctrine:只能通过DoctrineBundle配置“xml”,“yml”,“php”,“staticphp”或“attribute”

将 symfony 从 6 升级到 7 出现此学说错误 在 AbstractDoctrineExtension.php 第 229 行: ...

回答 1 投票 0

使用 Doctrine 通过单个 JOIN 查询预加载关系

我有一个与 Book 相关的实体 Author,其中一个作者有很多书。 我的图书馆里有很多书,我想一次性检索所有这些书及其作者信息...

回答 1 投票 0

Doctrine 数据库创建命令因 Postgresql 失败

当在 Symfony 中时,我尝试通过原则创建数据库:database:create 它会抛出以下异常: [学说\DBAL\异常\ConnectionException] 一个

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.