Propel没有返回所有行

时间:2016-06-30 08:02:14

标签: php postgresql propel

我尝试使用propel执行查询,它应该返回50行数据,但不会返回其他随机行数。我打印了在我的pgphpadmin中复制的查询,它返回50行。我不确定发生了什么。如果我执行" count"功能之前"发现"它返回50,但在返回随机数量的行之后。

$limit = 50;
$offset = 0;
..... //filters 
$companies = $companies->orderById()->limit($limit)->offset($offset);
var_dump($companies->count()); // this returns 50
$companies = $companies->find();
var_dump($companies->count()); // this returns 13

此外,foreach只迭代了13次。

这是生成的查询

SELECT "company"."id", "company"."otherfields",
"lists"."id", "lists"."otherfields", "place"."id",
"place"."otherfields", "contact"."id", "contact"."otherfields", 
"entry"."id","entry"."otherfields" 
FROM "company" LEFT JOIN "lists" ON 
("company"."sector_id"="lists"."id") LEFT JOIN "place" ON 
("company"."country_id"="place"."id") LEFT JOIN "contact" ON  
("company"."id"="contact"."company_id" AND "contact"."active" = true)
LEFT JOIN "entry" ON ("company"."id"="entry"."company_id") 
WHERE "company"."active"=true ORDER BY "company"."id" ASC LIMIT 50 OFFSET 0

Propel版本是2.0-dev

我总是遇到这个查询的问题所以我认为这个问题可能来自我在库中删除了一个 throw 的事实。我使用with()和limit()。生成的查询是正常的,但结果不是。

更改了Propel / Runtime / Formatter / ObjectFormatter.php 我对此发表了评论。

/*if ($this->hasLimit) {
            throw new LogicException('Cannot use limit() in conjunction with with() on a one-to-many relationship. Please remove the with() call, or the limit() call.');
}*/

我想这个错误可能来自这里。

我的加入查询如下所示

$companies->leftJoinWithLists()->leftJoinWithPlace()->leftJoinWithContact()->addJoinCondition('Contact','Contact.active = ?', true)->leftJoinWithEntry();

然后我添加限制。有什么方法可以避免这种情况或以其他方式做到这一点吗?

1 个答案:

答案 0 :(得分:1)

  

任何方法可以避免这种情况或以其他方式进行吗?

你需要以不同的方式做到这一点。请参阅我对您在https://github.com/propelorm/Propel2/issues/1231

创建的问题的评论

基本上,SQL中的LIMIT子句将限制结果集中的行数,但由于您使用的是LEFT JOIN,因此可以在结果集的多行中表示一个公司实体(参见pgphpadmin中的原始结果)。

解决方案:使用多个查询。我建议先查询所需的所有公司,然后在生成的->populateRelation()上使用ObjectCollection方法。