stibiumz / phalcon.eager-loading

Solves N+1 query problem in Phalcon Model
The Unlicense
36 stars 24 forks source link

Update readme to reflect constraints with loader #3

Closed Surt closed 9 years ago

stibiumz commented 9 years ago

This would not work, assuming 'Bar' as the model class name, and in case of being in a namespace should be 'Namespace\Bar.id'

So $builder->where('bar.id > 10'); must be $builder->where('Bar.id > 10'); or simply $builder->where('id > 10');

Could you please fix it?

Thanks for contributing.

Surt commented 9 years ago

Actually I did that using the table name and it's working. I will try to create a unit test to check it.

stibiumz commented 9 years ago

I've tried it, Phalcon 2

Failing:

$manufacturers = Loader::fromResultset(
    Manufacturer::find(),
    [
        'Robots.Bugs' => function (QueryBuilder $builder) {
            $builder->where('bug.id > 10');
        }
    ]
);

<br /> <b>Fatal error</b>: Uncaught exception 'Phalcon\Mvc\Model\Exception' with message 'Unknown model or alias 'bug' (1), when preparing: SELECT [Bug].* FROM [Bug] WHERE ([robot_id] IN (:phi0:, :phi1:, :phi2:, :phi3:, :phi4:, :phi5:, :phi6:, :phi7:, :phi8:, :phi9:, :phi10:, :phi11:, :phi12:, :phi13:, :phi14:, :phi15:, :phi16:, :phi17:)) AND (bug.id &gt; 10)' in /var/www/html/vendor/stibium/phalcon.eager-loading/src/EagerLoading/EagerLoad.php:203 Stack trace:

0 [internal function]: Phalcon\Mvc\Model\Query-&gt;_getQualified(Array)

1 [internal function]: Phalcon\Mvc\Model\Query-&gt;_getExpression(Array, true)

2 [internal function]: Phalcon\Mvc\Model\Query-&gt;_getExpression(Array, true)

3 [internal function]: Phalcon\Mvc\Model\Query-&gt;_getExpression(Array, true)

4 [internal function]: Phalcon\Mvc\Model\Query-&gt;_getExpression(Array)

5 [internal function]: Phalcon\Mvc\Model\Query-&gt;_prepareSelect()

6 [internal function]: Phalcon\Mvc\Model\Query-&gt;parse()

7 /var/www/html/vendor/stibium/phalcon.eager-loading/src/EagerLoading/EagerLoad.php(203): Pha in <b>/var/www/html/vendor/stibium/phalcon.eager-loading/src/EagerLoading/EagerLoad.php</b> on line <b>203</b><br />

Working:

$manufacturers = Loader::fromResultset(
    Manufacturer::find(),
    [
        'Robots.Bugs' => function (QueryBuilder $builder) {
            $builder->where('Bug.id > 10');
        }
    ]
);
Surt commented 9 years ago

Of course, you were right. Changed the builder where expression to Bar.

stibiumz commented 9 years ago

Thanks :+1: