Doctrine Project是一个开源库和工具的集合,用于处理用PHP编写的数据库抽象和对象关系映射。
Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue():参数#1($object)必须是类型?object,给定字符串
我正在开发一个表单来管理 Symfony 6.3 应用程序中的联系人。联系人创建效果很好。 但是,当我尝试修改联系人时,而不是通常显示的表单,...
我有一个 User 实体和一个 HistoryAccess 实体,它们绑定两个 User 实例,如下所示:其中指定为“允许”的用户可以获取指定为“所有者”的用户。 我正在努力...
无法删除名为 default 的连接的数据库 `symfony-project` 驱动程序中发生异常:SQLSTATE[HY000] [2002] 连接被拒绝
我不小心成功创建了一个数据库symfony项目,但它没有出现在我的phpmyadmin页面上。我想删除数据库 php bin/console 学说:database:drop --force 然后...
既然“setSQLLogger()”已被弃用,如何使用中间件在 Doctrine 3 中记录查询执行时间?
Doctrine 已弃用其 ->setSQLLogger(),转而使用中间件。 我找不到任何方法来记录查询的开始和结束以获取执行时间。 以前可以像这个问题一样完成...
我想知道这是否发生在某人身上? 在我的表中有两条记录。当我在存储库上执行 findAll 时,它返回一个包含 2 条记录的数组,但它是同一个记录(第一个记录)。 不是...
为什么我有 EntityManagerGhostEbeb667 作为 Doctrine 结果
当我在存储库中使用createQueryBuilder时: 如果(!$用户){ $结果 = $this->createQueryBuilder('m') ->andWhere('m.message_from 为 null 且 m.is_deleted_by_sender = false') ...
Symfony 5.4 使用maker-bundle 创建的数据库迁移添加了已弃用的注释
在使用 symfony/maker-bundle v1.43.0 的 Symfony 5.4 项目中,我遇到这个问题,即 make:migration 命令向行结构添加了已弃用的注释,这实际上导致了 DB 环境...
如何使用 symfony/validator 验证不可更新的列?
我有一个列,它是 DateTimeImmutable,当用户加入平台时保存。我正在进行 phpunit 测试,我想验证该列是否无法更新。我想要...
首先,我是 Symfony 和 Doctrine 的初学者,我正在研究我的形成的最终项目。 在这个项目中,我允许用户创建具有与其关联的独特游戏的事件...
我开始学习 Doctrine 并尝试使用外键在两列之间创建关系。在我的示例中,该关系应该在一个表内实现。这是我的实体类...
大家好,我有一个关于软删除内部关系的问题。 对于软删除,我使用 Gedmo\SoftDeleteable 这是我的实体(我已经删除了很多东西) 大家好,我有一个关于软删除内部关系的问题。 对于我正在使用的软删除Gedmo\SoftDeleteable,这是我的实体(我已经删除了很多东西) <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use JMS\Serializer\Annotation as JMS; /** * Item * * @ORM\Table(name="item") * @ORM\Entity(repositoryClass="AppBundle\Repository\ItemRepository") * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) */ class Item implements EntityInterface { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * One Item has Many Images. * @ORM\OneToMany(targetEntity="Image", mappedBy="item", cascade="remove") * @MaxDepth(1) * @JMS\Groups({"images"}) */ private $images; /** * @var \DateTime * * @ORM\Column(name="deleted_at", type="datetime", nullable=true) */ protected $deletedAt; public function getId() { return $this->id; } public function __construct() { $this->images = new \Doctrine\Common\Collections\ArrayCollection(); } public function addImage(\AppBundle\Entity\Image $image) { $this->images[] = $image; return $this; } public function removeImage(\AppBundle\Entity\Image $image) { $this->images->removeElement($image); } public function getImages() { return $this->images; } public function getImagePreview() { foreach($this->getImages() as $image){ if ($image->getPreview()) { return substr($image->getPath(), strpos($image->getPath(), "/images/") + 8); } } return ''; } public function setDeletedAt($deletedAt) { $this->deletedAt = $deletedAt; return $this; } public function getDeletedAt() { return $this->deletedAt; } } 我删除了一些图像,并且在我的数据库中,当图像被删除时,字段deleted_at被编译,因此如果我自动创建带有教义的findAll,记录不会返回 但是,如果我从模板中调用 getImages,我会检索所有图像以及已删除的图像,但我不想要它。 这就是我在循环内从模板调用 getImages 的方式: foreach($lot->getImages() as $image) { //code } 如何使用函数getImages仅检索未删除的图像? 谢谢 附注我不想在模板中插入if condition,我想在后端解决它 Doctrine 有 2 种实体操作方法:EntityPersister 或 DQL 至 QueryBuilder。对于像 findAll 这样的简单查询,Doctrine 将选择 BasicEntityPersister 来执行查询。 现在的问题是 Gedmo 不扫描已执行实体的关联,它只关注当前查询。在第一个EntityPersister模式中,由于缺乏关联意识,它永远不会添加所需的条件。您可以使用第二种模式来欺骗它,使用 QueryBuilder 和 innerJoin 以及 Images 实体 - 这对您来说将是最快的解决方案。 我为 BasicEntityPersister 提供了一个复杂的解决方案,并且它有效。步骤如下: 创建一个新的 EntityManager 扩展 EntityManagerDecorator 并装饰服务: entity_manager_proxy: public: false class: App\Doctrine\EntityManagerProxy decorates: doctrine.orm.default_entity_manager arguments: [ "@entity_manager_proxy.inner" ] 为 UOW 创建一个装饰器并在新的 EM 中调用它: public function getUnitOfWork() { return new UnitOfWorkProxy($this); } 在您的 UOW 代理中,您现在可以根据需要覆盖 EntityPersister。我确实喜欢这样: public function getEntityPersister($entityName) { $persister = parent::getEntityPersister($entityName); // we are only hooking up the common persister if (!$persister instanceof BasicEntityPersister) { return $persister; } $class = $this->em->getClassMetadata($entityName); return new SoftDeleteableBasicEntityPersister( $this->em, $class ); } 这是实现这一技巧的实际代码:扫描关联并添加所需的条件。幸运的是,我不必覆盖整个 getSelectColumnsSQL 方法: protected function getSelectColumnsSQL() { // luckily we don't need to modify the SQL created, but a property in the context $sql = parent::getSelectColumnsSQL(); $aliasCounter = 0; // we'll be going through all associations and find those with the soft-deleted trait foreach ($this->class->associationMappings as $assocField => $mapping) { $targetEntityClass = $mapping['targetEntity']; if (!$this->isSoftDeleted($targetEntityClass)) { continue; } if (!$mapping['isOwningSide']) { continue; } $targetEntityClassMetadata = $this->em->getClassMetadata($targetEntityClass); if ($mapping['mappedBy'] !== null) { $association = $targetEntityClassMetadata->getAssociationMapping($mapping['mappedBy']); } else { $association = $mapping; } $assocAlias = 's' . ($aliasCounter++); $joinTableAlias = $this->getSQLTableAlias($targetEntityClassMetadata->name, $assocAlias); $joinTableName = $this->quoteStrategy->getTableName($targetEntityClassMetadata, $this->platform); $tableAlias = $this->getSQLTableAlias($association['targetEntity'], $assocAlias); // if we're sure our entity has a relation with a soft-deleted entity, // let's add an INNER JOIN to prevent from listing those which were deleted $this->currentPersisterContext->selectJoinSql .= ' INNER JOIN'; foreach ($association['joinColumns'] as $joinColumn) { $sourceCol = $this->quoteStrategy->getJoinColumnName($joinColumn, $this->class, $this->platform); $targetCol = $this->quoteStrategy->getReferencedJoinColumnName($joinColumn, $this->class, $this->platform); $joinCondition[] = $this->getSQLTableAlias($association['sourceEntity']) . '.' . $sourceCol . ' = ' . $tableAlias . '.' . $targetCol; } // Add filter SQL $filterSql = $this->generateFilterConditionSQL($targetEntityClassMetadata, $tableAlias); if ($filterSql) { $joinCondition[] = $filterSql; } // the result of our operation is stored inside the context // luckily this will be pulled into the main SQL later $this->currentPersisterContext->selectJoinSql .= ' ' . $joinTableName . ' ' . $joinTableAlias . ' ON '; $this->currentPersisterContext->selectJoinSql .= implode(' AND ', $joinCondition); } return $sql; } 对于 Doctrine 2.4,它可以工作,但如果 Doctrine 的未来版本允许以更一致的方式修改查询,则可能会更改/中断。 对于DQL/QueryBuilder操作方法,您需要以类似的方式重写EntityRepository和QueryBuilder,然后基本上您可以根据需要围绕getQuery()方法进行操作,使用SqlWalkers等的提示。如果需要可以提供解决方案 希望有帮助!
使用 Native SQL 的 Doctrine 递归查询隐藏父列
我的函数如下所示: 公共函数 findRecursiveByParentOrId(int $parentId, string $column): 数组 { $rsm = new ResultSetMapping(); $rsm->addEntityResult(Divisi...
我有一个控制器方法,我正在为我的实体订单创建一个插入方法,它与用户实体有关系,一个用户可以有很多订单,现在当我创建订单并设置用户t时...
Doctrine 和 Laminas 错误:driverClass 必须实现 Doctrine\DBAL\Driver 接口
我最近将Laminas项目从doctrine-migrations 1.4升级到3.6,并将doctrine-orm-module从1升级到5.3。在我的部署服务器上,运行 ./vendor/bin/doctrine-modulesync-metadata-sto...
Doctrine 中 `FindOneBy` 和 `Find` 的区别
使用 Doctrine 可以通过 ID 进行查找,就像您想获得有关用户的所有信息一样。 你可以这样做: $em->getRepository(User::class)->findOneBy(array('id' => 1)); 或者...
我有一对现有的表,不幸的是我无法更改它们的任何内容,因为它们来自不同的应用程序,并且至少在可预见的将来该应用程序仍然必须......
我有这个表头 id、candidate_id、job_id、阶段、created_at、updated_at 1,2,1,3,"2023-09-04 11:35:18","2023-09-04 11:53:12" 2,2,2,2,"2023-09-04 11:36:28","2023-...
所以在我的表中,我有一个名为“data”的列,即 varchar(3000)。 这基本上是一个 json blob,这是它所包含内容的示例: {“homeWidgetToShow”:“chat_and_n...
教义:调用 getRootAlias() 错误之前未设置别名
我原来的查询是: 从用户 u 中选择 * 内联公司c 在 u.company_id = c.id 上 其中 u.id=2 我把它做成了: $em = $this->get('doctrine')->getEntityManager(); $qb = $em->