Это потому, что LIMIT
работает со строками базы данных, а не с "объектами".Когда вы набираете $q->limit(10)
, вы хотите получить десять объектов, а не десять строк из базы данных.
Рассмотрите следующий запрос (продукты и категории имеют отношение «многие ко многим»):
SELECT p.*, c.* FROM product p
INNER JOIN product_category_ref pcr ON p.id = pcr.prodcut_id
INNER JOIN category c ON c.id = pcr.category_id
WHERE p.price < 123;
Чтобы получить 10 товаров (объектов), ваш запрос должен получить не менее 20 строк.Вы не можете использовать LIMIT 10
, потому что (только для примера) будут возвращены только 3 продукта.Вот почему вам необходимо выяснить, какие продукты следует выбрать (ограничение относится к продуктам), а затем извлечь фактические данные.
Это приведет к следующим запросам:
SELECT p.id FROM product p WHERE p.price < 123;
SELECT ..... WHERE p.id IN (...);
Второй запросможет вернуть 20, 423 или 31 строку.Как видите, это не значение из limit()
.
PS.В этом случае Doctrine2 гораздо понятнее, так как использует setMaxResults()
метод вместо limit()
, что не так сложно.