DateTime return null 的 Doctrine FindOneBy
Doctrine FindOneBy with exact DateTime return null
我有两个表,orders
和 appointment
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)
有谁知道如何在不使用学说的情况下解决问题?另外,我很想知道为什么它不起作用,这让我发疯。
为了完整起见,我使用的是:
- PHP 7.4.3
- doctrine/common 3.0.2
- Symfony v5.0.11
我也调查过类似的问题,例如 ,但他们使用的是 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 关系而不是日期。
我有两个表,orders
和 appointment
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)
有谁知道如何在不使用学说的情况下解决问题?另外,我很想知道为什么它不起作用,这让我发疯。
为了完整起见,我使用的是:
- PHP 7.4.3
- doctrine/common 3.0.2
- Symfony v5.0.11
我也调查过类似的问题,例如
如果使用标量值会发生什么。所以字符串格式的直接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 关系而不是日期。