2016-06-30 3 views
0

Я пытаюсь выполнить запрос, используя propel, и он должен вернуть 50 строк данных, но вместо этого он возвращает другое случайное число строк. Я напечатал запрос, скопированный в моем pgphpadmin, и он возвращает 50 строк. Я не уверен, что происходит. Также, если я выполняю функцию «count» до «find», она возвращает 50, но после этого возвращает случайное количество строк.Propel не возвращает все строки

$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 в библиотеке. Я использую с() и 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

Любой способ избежать этого или сделать это по-другому?

Вам нужно сделать это по-другому. Смотрите мой комментарий по этому вопросу, созданный на https://github.com/propelorm/Propel2/issues/1231

В принципе, предложение в SQL LIMIT будет ограничивать количество строк в наборе результатов, но так как вы используете объект LEFT JOIN, одна компания может быть представлена ​​в нескольких строках результирующий набор (см. исходный результат в pgphpadmin).

Решение: используйте несколько запросов. Я предлагаю сначала опросить все компании, которые вы хотите, затем используя метод ->populateRelation() в результате ObjectCollection.

Смежные вопросы