Doctrine Project是一个开源库和工具的集合,用于处理用PHP编写的数据库抽象和对象关系映射。
Doctrine 迁移:重复生成相同的 ALTER TABLE 语句
我最近将我的 Symfony 项目从 5.4 升级到 6.4.13。现在,我在 Symfony 项目中遇到了 Doctrine Migrations 的问题。当我运行doctrine:migrations:diff 命令时,它生成...
无法将 PHP 值 X 转换为 uuid 类型。需要以下类型之一:字符串。但是 X 实现了 \Stringable
当我调用Doctrine的flush函数来保存X实体时,出现转换错误。 无法将 X 类型的 PHP 值转换为 uuid 类型。需要以下类型之一:null、string、Symfony\
在数据库中创建现有类型实体并将其添加到数据实体,而无需加载不带参数的类型实体 Symfony 或 Builder
我面临着一个相当具体的问题。我们继承了一个已经存在很长时间的应用程序,没有任何测试套件,并且很难维护。为了改善这一点,我们创建了一个...
我正在尝试使用原则构建 SQL 查询。这是我的代码片段: /** * @Route("/db", name="user_skill_testing") */ 公共函数 dbTest() { //用户的所有技能 $用户名 = "J...
如何改进 DoctrineODM 中的 MongoDB 搜索结果
我正在尝试将我的 mongo 搜索引擎发展为更先进的东西。我知道为什么下面的代码给出了结果。我为如何扩展搜索功能而苦恼。 我会...
Doctrine中如果参数为null,如何忽略where语句?
我在 Doctrine 中的 QueryBuilder 有问题。我编写了一个有 2 个参数的查询,它们影响 where 语句。如果相关参数为空,我想忽略 where 语句....
Symfony2 Doctrine 查询生成器 where IN
我在谷歌上浪费了数万亿个小时,但没有一个解决方案是好的。 我有这个查询生成器: $qb2=$this->createQueryBuilder('s') ->addSelect(‘u’) ->innerJoin...
我使用教义。 是否可以生成基于带有表(重要)但没有主键的数据库的实体? 数据库用于 Chacal XXI(一个应用程序),并且 1 或 2 个表没有主表...
INET_ATON 在where 语句doctrine2 querybuilder zend2
问题:我想在 Doctrine2 中使用 querybuilder 运行查询,例如: SELECT * FROM TABLE WHERE `column1` = 'x' and (`column2` = INET_ATON('1.1.1.1') OR `column3` like '%bla%'...) 我该怎么办...
我正在使用 Symfony 5,并且在迁移时遇到了一些问题。 我正确创建了模型,所有迁移都通过了。 只是为了检查我运行: ./bin/console 学说:schema:vaidate 这告诉我...
将 Doctrine/doctrine-fixtures-bundle 更新到 v3.7.0 后,我在尝试加载灯具时收到此错误: 在 AbstractFixture.php 第 78 行: 函数 Doctrine\Common\
PHP Doctrine - 违反完整性约束:1062 重复条目(主键)
我正在从自定义 PDO 查询加载大量 User 和相关的 Group 对象(使用 Doctrine 连接 => $dbh = Doctrine_Manager::connection()->getDbh(); )。该查询涉及交叉连接...
我有以下型号: 我有以下型号: <?php namespace App\Domain\Model\Meal; use App\Domain\Model\HasUuid; use App\Domain\Model\Timestampable; use App\Domain\Model\User\Child; use Doctrine\ORM\Mapping as ORM; use Ramsey\Uuid\Uuid; #[ORM\Entity] #[ORM\Table(name: 'meal_opt_out')] final class MealOptOut { use HasUuid; use Timestampable; #[ORM\ManyToOne(targetEntity: MealItemSchedule::class)] #[ORM\JoinColumn(name: 'meal_item_schedule_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private MealItemSchedule $mealItemSchedule; #[ORM\ManyToOne(targetEntity: Child::class)] #[ORM\JoinColumn(name: 'child_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private Child $child; public function __construct( MealItemSchedule $mealItemSchedule, Child $child ) { $this->id = Uuid::uuid4()->toString(); $this->mealItemSchedule = $mealItemSchedule; $this->child = $child; } // Getters and setters... } 具有Uuid特征: <?php namespace App\Domain\Model; use Doctrine\ORM\Mapping as ORM; trait HasUuid { #[ORM\Id] #[ORM\Column(name: 'id', type: 'string', unique: true)] protected string $id; public function getId(): string { return $this->id; } public function setId(string $id): void { $this->id = $id; } } 我使用的是六角形架构,所以我有一些接口,但最重要的文件是DoctrineMealOptOutRepository: <?php namespace App\Infrastructure\Repository\Meal; use App\Domain\Model\Meal\MealOptOut; use App\Domain\Repository\Meal\MealOptOutRepositoryInterface; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; final class DoctrineMealOptOutRepository extends ServiceEntityRepository implements MealOptOutRepositoryInterface { public function __construct( private ManagerRegistry $manager, ) { parent::__construct($manager, MealOptOut::class); } /* public function save(MealOptOut $mealOptOut): void { $this->getEntityManager()->persist($mealOptOut); $this->getEntityManager()->flush(); } */ public function save(MealOptOut $mealOptOut): void { $connection = $this->getEntityManager()->getConnection(); $sql = ' INSERT INTO meal_opt_out (id, meal_item_schedule_id, child_id, created_at, updated_at) VALUES (:id, :meal_item_schedule_id, :child_id, NOW(), NOW()) '; $params = [ 'id' => $mealOptOut->getId(), 'meal_item_schedule_id' => $mealOptOut->getMealItemSchedule()->getId(), 'child_id' => $mealOptOut->getChild()->getId(), ]; $connection->executeStatement($sql, $params); } } MealOptOutRepository接口: <?php namespace App\Domain\Repository\Meal; use App\Domain\Model\Meal\MealOptOut; interface MealOptOutRepositoryInterface { public function save(MealOptOut $mealOptOut): void; } MealOptOutService接口: <?php namespace App\Domain\Service\Meal; use App\Domain\Model\Meal\MealItemSchedule; use App\Domain\Model\Meal\MealOptOut; use App\Domain\Model\User\Child; interface MealOptOutServiceInterface { public function saveMealOptOut(MealOptOut $mealOptOut): ?MealOptOut; } MealOptOutService 实施: <?php namespace App\Domain\Service\Meal\Impl; use App\Domain\Model\Meal\MealItemSchedule; use App\Domain\Model\Meal\MealOptOut; use App\Domain\Model\User\Child; use App\Domain\Repository\Meal\MealOptOutRepositoryInterface; use App\Domain\Service\Meal\MealOptOutServiceInterface; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; use Ramsey\Uuid\Uuid; final class MealOptOutServiceImplementation extends ServiceEntityRepository implements MealOptOutServiceInterface { public function __construct( private MealOptOutRepositoryInterface $mealOptOutRepository, private ManagerRegistry $manager, ) { parent::__construct($manager, MealOptOut::class); } public function saveMealOptOut(MealOptOut $mealOptOut): ?MealOptOut { return $this->mealOptOutRepository->save($mealOptOut); } } 该服务的调用方式如下: $mealOptOut = new MealOptOut($this->selectedMealItemSchedule, $child); // $mealOptOut->setId(Uuid::uuid4()->toString()); $this->mealOptOutService->saveMealOptOut($mealOptOut); 问题是当我在DoctrineMealOptOutRepository中使用这个版本的save时 public function save(MealOptOut $mealOptOut): void { $this->getEntityManager()->persist($mealOptOut); $this->getEntityManager()->flush(); } 我收到以下错误: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1364 Field 'id' doesn't have a default value ... at Doctrine\DBAL\Connection->convertExceptionDuringQuery(object(Exception), 'INSERT INTO meal_opt_out (created_at, updated_at, meal_item_schedule_id, child_id) VALUES (?, ?, ?, ?)', array(null, null, 'f8ab33de-ab9d-11ef-bcf3-44da78cb937b', 'a440ab82-573d-4475-a9e3-b5bf839352ed'), array('datetime', 'datetime', 'string', 'string')) 您在日志中看到实体管理器由于某种原因没有插入 id 列。我 100% 确定 id 已设置。我对其他实体使用完全相同的架构和特征,并且它适用于它们。我尝试自动生成 uuid,但这也没有帮助。 我暂时通过手动执行 SQL 来修复它(确实有效,表明 ID 确实设置正确)。 我做错了什么? 您可能缺少GenerateValue行,如下所示: <?php namespace App\Domain\Model; use Doctrine\ORM\Mapping as ORM; trait HasUuid { #[ORM\Id] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\Column(type: 'uuid', unique: true)] #[ORM\CustomIdGenerator(class: UuidGenerator::class)] private ?UuidInterface $id = null;
使用原则 2,是否可以: 从生成的代理类中排除属性? 完全禁用延迟加载/代理生成? 我在序列化我的实体时遇到问题(使用
我正在使用symfony和api平台。 我有一个资源: /** * @ApiResource() */ 班级学分 { /** * @ORM\Id() * @ORM\GenerateValue() * @ORM\Column(类型=“整数”) ...
如何在 Doctrine 数据库抽象层 (DBAL) 中输入 NULL 或字符串
我使用的是 Symfony 7.4.1 ... 使用 Doctrine\DBAL\Connection; 使用 Doctrine\DBAL\ParameterType; ... 公共函数 setImages(int $post_id, ?string $images_str): void { $this->连接...
我在一个项目中使用 Doctrine,我必须找到一个值。如果这样的值不存在或者有多个值,则必须启动另一个进程。 我想我应该使用
执行查询时发生异常:SQLSTATE[42S01]: 基表或视图已存在: 1050 表 'user' 已存在
我已经在 symfony 中生成了此迁移,以将createdAt和UpdatedAt字段添加到表中 我已经在 symfony 中生成了此迁移,以将createdAt和UpdatedAt字段添加到表中 <?php declare(strict_types=1); namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; /** * Auto-generated Migration: Please modify to your needs! */ final class Version20241105173344 extends AbstractMigration { public function getDescription(): string { return ''; } public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE user ADD created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', ADD updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\''); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE `user` DROP created_at, DROP updated_at'); } } 但是当我尝试执行迁移时 An exception occurred while executing a query: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'user' already exists 迁移并没有尝试再次创建表,我不知道迁移出了什么问题 Doctrine 迁移系统将所有已执行的迁移保存在单独的表中,以“记住”哪些迁移已经执行。一旦执行迁移过程,它会在代码中找到第一个未执行的迁移,并从这一个开始执行所有未执行的迁移。 现在,回到你的错误。它清楚地显示 Table 'user' already exists,这意味着它正在尝试创建表格。如果由于某种原因您的数据库中已存在此表,但负责此更改的迁移未标记为已执行,并且当您开始迁移过程时,它会尝试执行“创建表用户”查询,则可能会发生这种情况,这很可能位于代码中旧迁移中的某个位置。它与您在问题中给我们的迁移无关。
更改 symfony 上的嵌入字段名称以避免无法识别的字段:App\Domain\Entity\User::$email 问题
我有这个实体 我有这个实体 <?php namespace App\Domain\Entity; use App\Domain\ValueObject\Email; use App\Domain\ValueObject\Name; use App\Domain\ValueObject\Password; use App\Domain\ValueObject\Surname; use Ramsey\Uuid\UuidInterface; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\UserInterface; class User implements UserInterface, PasswordAuthenticatedUserInterface { public function __construct( private UuidInterface $id, private Name $name, private Surname $surname, private Email $email, private Password $password, private array $roles = [] ) {} public function getId(): UuidInterface { return $this->id; } public function setId(UuidInterface $id): void { $this->$id = $id; } public function getName(): Name { return $this->name; } public function setName(Name $name): void { $this->name = $name; } public function getSurname(): Surname { return $this->surname; } public function setSurname(Surname $surname): void { $this->surname = $surname; } public function getEmail(): string { return $this->email->value(); } public function setEmail(String $email): void { $this->$email = new Email($email); } public function getVOEmail(): Email { return $this->email; } public function setVOEmail(Email $email): void { $this->$email = $email; } public function getVOPassword(): Password { return $this->password; } public function setVOPassword(Password $password): void { $this->password = $password; } public function getPassword(): ?string { return $this->password->value(); } public function setPassword(string $password): static { $this->password = $password; return $this; } /** * Get the roles granted to the user. */ public function getRoles(): array { // Garantizar que cada usuario tenga al menos el rol ROLE_USER if (empty($this->roles)) { $this->roles[] = 'ROLE_USER'; } return array_unique($this->roles); } /** * Set the roles for the user. */ public function setRoles(array $roles): static { $this->roles = $roles; return $this; } /** * Get the user identifier (e.g., email). */ public function getUserIdentifier(): string { return $this->email->value(); // O cualquier otro identificador único } /** * Erase any sensitive information. */ public function eraseCredentials(): void { // Si hay información sensible que deseas eliminar, hazlo aquí. // Por ejemplo, si usaste una contraseña sin encriptar durante la autenticación: // $this->plainPassword = null; // O cualquier otro campo temporal. } } 这样映射 <?xml version="1.0" encoding="UTF-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://raw.githubusercontent.com/doctrine/doctrine2/main/doctrine-mapping.xsd"> <!-- Definición de la entidad --> <entity name="App\Domain\Entity\User" table="`user`" repository-class="App\Infrastructure\Service\UserRepository"> <!-- Identificador (ID) --> <id name="id" type="uuid" column="id"> <generator strategy="NONE"/> <!-- Usamos un UUID generado manualmente --> </id> <!-- Definición de los campos --> <embedded name="email" class="App\Domain\ValueObject\Email" use-column-prefix="false"/> <embedded name="name" class="App\Domain\ValueObject\Name" use-column-prefix="false"/> <embedded name="surname" class="App\Domain\ValueObject\Surname" use-column-prefix="false"/> <embedded name="password" class="App\Domain\ValueObject\Password" use-column-prefix="false"/> <!-- Definición de la columna JSON para los roles --> <field name="roles" type="json" column="roles"/> </entity> </doctrine-mapping> 和可嵌入映射 <?xml version="1.0" encoding="UTF-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://raw.githubusercontent.com/doctrine/doctrine2/main/doctrine-mapping.xsd"> <!-- Definición del objeto embebido --> <embeddable name="App\Domain\ValueObject\Email"> <!-- Campo de la clase Email --> <field name="value" column="email" type="string" length="255" nullable="false"/> </embeddable> </doctrine-mapping> 电子邮件是一个值对象(与属性上的其余部分一样),我使用了属性的嵌入式类,我的工作是将用户存储在数据库中,但不是使用LexikJWTAuthenticationBundle登录,问题是当我尝试登录用户我收到此错误Unrecognized field: App\Domain\Entity\User::$email 调试发现这段代码 $this->class->fieldMappings[$field] 不会将字段名称重新调整为电子邮件、姓名、姓氏...它会在类中返回 email.value 、name.value...,因为电子邮件值包含在名为 $value 的变量中 <?php namespace App\Domain\ValueObject; class Email { public function __construct(private string $value) {} public function value(): string { return $this->value; } } 我不知道如何在调用 name 时获取 name.value 而不是 $this->class->fieldMappings[$field],名称已在 xml 配置文件中设置 将用户名和电子邮件等数据保存为 VO 是非常非标准的方式。如果您放弃这个想法并重构您的实体以将此类数据保存为字符串(您始终可以创建专门的 getter 来设置和获取这些值作为 VO),您将从长远来看受益。 如果 LexikJWTAuthenticationBundle 仅限于使用 ORM 映射来获取这些属性,并且您无法覆盖此行为,那么不幸的是,我没有看到解决方案。作为最后的手段,您可以覆盖捆绑包本身中的这部分代码(如果可能的话,通过使用 symfony DI 覆盖服务),但我也不推荐这样做,因为它可能会导致更糟糕的情况和不可预测的情况未来(不提升级包后的问题)。 最后一件事,如果有办法以某种方式为 LexikJWTAuthenticationBundle 提供属性路径而不是映射字段,您可能可以创建一个单独的 getter (例如 getEmailValue、getNameValue),并使捆绑包使用 emailValue 和 nameValue 属性。但是,同样,这个捆绑包很可能无法开箱即用。
Doctrine 查询生成器使用 join 嵌套 orX 和 andX 条件
我有两个实体 User 和 CalendarEvent。我的用户附属于一家工厂,calendarEvent 可用于了解用户是否被“借用”到他所属工厂的另一家工厂...... 我的两个