Доктрина: присоединение к таблице не помечает данные как загруженные - PullRequest
1 голос
/ 16 февраля 2010

Итак, у меня есть две таблицы: X и Y.

schema.yml выглядит так:

X: 
  columns:
    something: { type: string(255), notnull: true }
    y_id: { type: integer, notnull: true }
  relations:
    Y: { onDelete: CASCADE, local: y_id, foreign: id, foreignAlias: xs }
Y:
  columns:
    something: { type: string(255), notnull: true }

И в моем XTable есть:

class XTable extends Doctrine_Table
{
    function getXesWithYs()
    {
        return $this->createQuery("x")->leftJoin("x.Y y")->execute();
    }
}

Сгенерированный запрос фактически выбирает и x. *, И y. *, Но когда я пытаюсь использовать данные Y, он выполняет дополнительный запрос для каждой строки, выбирающей Y, где y.id = x.y_id.

Так что, если я сделаю:

echo $results[0]->Y->something;

Doctrine снова запустит дополнительный запрос, извлекающий данные Y.

Это происходит только один раз за строку Y. Если я использую его снова, он не будет загружен в третий раз, но если я использую $result[1] 's, я получу другой запрос.

1 Ответ

1 голос
/ 18 февраля 2010

Ах, доктрина ленивой загрузки в самом своем глупом или, по крайней мере, не очень хорошо документирована.

Кажется, что даже если вы присоединяетесь к чему-то, как вы сделали, вы также должны выбрать эти таблицы. Вот так:

class XTable extends Doctrine_Table
{
    function getXesWithYs()
    {
        return $this->createQuery("x")->select('x.*, y.*')->leftJoin("x.Y y")->execute();
    }
}
...