Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令在使用连接和偏移时跳过数据集_Php_Symfony1_Doctrine - Fatal编程技术网

Php 条令在使用连接和偏移时跳过数据集

Php 条令在使用连接和偏移时跳过数据集,php,symfony1,doctrine,Php,Symfony1,Doctrine,我在PHP5.3上使用Symfony 1.4中的条令1.2 我有一个数据库,其中事件有多个开始日期时间1:n和类型n:m 对于一个程序,我需要一个开始时间和事件标题的列表,它们属于一种特殊类型,并且没有过时: $dql = Doctrine_Query::create() ->select('ed.start_datetime,e.title')/*edd.*,*/ ->from('EventDate ed') ->leftJoin('ed.Event e')

我在PHP5.3上使用Symfony 1.4中的条令1.2

我有一个数据库,其中事件有多个开始日期时间1:n和类型n:m

对于一个程序,我需要一个开始时间和事件标题的列表,它们属于一种特殊类型,并且没有过时:

$dql = Doctrine_Query::create()
  ->select('ed.start_datetime,e.title')/*edd.*,*/
  ->from('EventDate ed')
  ->leftJoin('ed.Event e')
  ->leftJoin('e.EventTypes et')
  ->leftJoin('e.Domain d')
  ->orderBy('ed.start_datetime, ed.event_id');
  ->where('e.start_datetime >= ? AND e3.id = ?',array('2011-05-27 17:19:41',2))
  ->fetchArray();
可以在以下位置查看该模式

现在,条令有两种说法

SELECT DISTINCT e5.event_id FROM event_date e5 LEFT JOIN event e6 ON e5.event_id = e6.id LEFT JOIN event_event_type e8 ON (e6.id = e8.event_id) LEFT JOIN event_type e7 ON e7.id = e8.event_type_id WHERE (e5.start_datetime >= '2011-05-27 17:19:41' AND e7.id = '2') ORDER BY e5.start_datetime, e5.event_id

SELECT e.event_id AS e__event_id, e.start_datetime AS e__start_datetime, e2.id AS e2__id, e2.title AS e2__title FROM event_date e LEFT JOIN event e2 ON e.event_id = e2.id LEFT JOIN event_event_type e4 ON (e2.id = e4.event_id) LEFT JOIN event_type e3 ON e3.id = e4.event_type_id WHERE e.event_id IN (*all the IDs from the first query*) AND (e.start_datetime >= '2011-05-27 17:19:41' AND e3.id = '2') ORDER BY e.start_datetime, e.event_id
当我引入分页时,问题就开始了:当我添加偏移量时,它将添加到第一个查询中。现在,由于一个事件可能有多个开始时间,第一个SELECT DISTINCT查询中的ID数可能小于日期数。因此,可能会跳过日期。在我的例子中,甚至有不到50个不同的事件,因此显示事件日期51-100的第二个页面实际上是空的,尽管由于反复发生的事件,有几百个事件日期

我认为这个问题也许可以解决,但我无法控制


有人知道吗?

当您有一个基表并跨一对多关系联接时,Doctrine会以称为“限制子查询”的模式运行两个查询,第一个是一个不同的查询。这是因为您将选择联接的乘积,并且最终得到的行数将超过基表中的记录数。例如,如果事件5有两种EventType,则数据库将返回两行中的事件5。这两种查询行为仅在MySQL中存在,其他数据库可以在子查询中运行限制,并且条令生成单个查询

因为您的事件有多个日期,并且EventDate有一个复合主键,所以条令应该在第一个查询中选择一组不同的事件id,start_datetime,但它似乎忽略了复合主键的第二部分,可能是因为它无法在第二个查询中将它们填充到ON子句中

您可以通过以下两种或三种方式之一解决此问题: 1向EventDate自动增量列添加唯一的主键。您可能不必在其他任何地方引用它,但doctrine将开始使用它 2手动执行2个查询。选择所有不同的事件\u id,从EventDate开始\u datetime,添加限制和偏移量,然后以编程方式创建where子句:

 ... WHERE ((event_id = ? AND start_datetime = ?) OR (event_id = ? AND start_datetime = ?))... 
3重新排序查询以从不同的表开始,或在select中添加一个DISTINCT。尝试选择distincted.event\u id,ed.start\u datetime。有时,这些事情可以避免限制子查询算法触发。 4关闭此系统,请参阅下面的链接,从未尝试过此方法,我不确定水合作用和条令对象缓存中有哪些副作用

就个人而言,我会选择1。我发现,在条令中有额外的主键列总是有帮助的,即使您可以跨多个列形成主键


如果您想查看条令用于此目的的代码,请参阅lib/doctor/Record.php,函数getLimitSubquery。您会注意到注释//关于复合键呢?在代码中输入两次。您也可以阅读您的模式。另外,您尝试分页的结果是什么,例如EventDate或Event?您是否使用sfDoctrinePager进行分页?只是一个注释,您缺少一个?从DQL中的WHERE子句。您可以通过在原始SQL中编写此命令来消除DISTINCT。我不使用sfDoctrinePager,因为它用于XML输出。失踪者?是由于简化而导致的错误: