DateTime return null 的 Doctrine FindOneBy

Doctrine FindOneBy with exact DateTime return null

我有两个表,ordersappointment

CREATE TABLE `orders` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_buyer` int(10) UNSIGNED DEFAULT NULL,
  `id_seller` int(10) UNSIGNED DEFAULT NULL,
  `reference` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `first_appointment` datetime DEFAULT NULL,
  `status` smallint(5) UNSIGNED NOT NULL,
  `creation_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `paid_date` datetime DEFAULT NULL,
  `fulfilled_date` datetime DEFAULT NULL,
  `returned_date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `appointment` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_owner` int(10) UNSIGNED DEFAULT NULL,
  `id_customer` int(10) UNSIGNED DEFAULT NULL,
  `start` datetime NOT NULL,
  `end` datetime NOT NULL,
  `online` tinyint(1) NOT NULL,
  `participant_number` smallint(5) UNSIGNED NOT NULL,
  `status` smallint(6) NOT NULL,
  `creation_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这两个表都是由 Symfony 和 doctrine 使用实体自动创建的。

当我尝试创建自定义 sql 查询时,一切正常:

SELECT `id`, `id_owner`, `id_customer`, `start`  FROM `appointment` WHERE `id_owner` = 20 AND `id_customer` = 1 AND `start` = '2020-06-06 10:00:00'
+-----+----------+-------------+---------------------+
| id  | id_owner | id_customer | start               |
+-----+----------+-------------+---------------------+
| 763 |       20 |           1 | 2020-06-06 10:00:00 |
+-----+----------+-------------+---------------------+
1 row in set (0.00 sec)

现在,这是我的问题,当我执行与上面的查询相同的操作,但使用 doctrine 中的 findOneBy 时,它 returns null。

$a = $repo->findOneBy(['start'=> $order->getFirstAppointment(), 'owner' => $order->getSeller(), 'customer' => $order->getBuyer()]);
var_dump($a);
var_dump($o->getFirstAppointment());
var_dump($order->getSeller()->getId());
var_dump($order->getBuyer()->getId());

这是var_dump输出

ExampleController.php:390:null

ExampleController.php:391:
object(DateTime)[2692]
  public 'date' => string '2020-06-16 10:00:00.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

ExampleController.php:392:int 20

ExampleController.php:393:int 1

当我不使用日期时,一切正常,但是,我需要使用日期。我的猜测是,这是因为日期 '2020-06-16 10:00:00.000000' 末尾有一些零,但是当我查看数据库时,“.000000”没有显示在任何地方。

mysql> SELECT `first_appointment` FROM orders WHERE id = 13;
+---------------------+
| first_appointment   |
+---------------------+
| 2020-06-16 10:00:00 |
+---------------------+
1 row in set (0.00 sec)

有谁知道如何在不使用学说的情况下解决问题?另外,我很想知道为什么它不起作用,这让我发疯。

为了完整起见,我使用的是:

我也调查过类似的问题,例如 ,但他们使用的是 BETWEEN 日期,而不是完全匹配。

如果使用标量值会发生什么。所以字符串格式的直接id和datetime

$a = $repo->findOneBy([
    'start'=> $order->getFirstAppointment()->format('Y-m-d H:i:s'), 
    'owner' => $order->getSeller()->getId(), 
    'customer' => $order->getBuyer()->getId()
]);






或使用 DQL 进行更多控制

$query = $em->createQuery( 'SELECT u FROM Namespace\EntityName u WHERE u.start = :start AND u.owner = :owner AND u.customer = :customer' );
                    
$query->setParameters([
     'start' => $order->getFirstAppointment()->format('Y-m-d H:i:s') ,
     'owner' => $order->getSeller()->getId(),
     'customer' => $order->getBuyer()->getId()

 ]);
$result = $query->getResult();

作为快速提示。将 ID 键用于关系映射可能是一个更好的主意。在订单中,您将使用从订单到约会 ID 的 one-to-one 关系而不是日期。