Остановить связанные объекты для запроса в доктрине 2 при использовании QueryBuilder

У меня есть два объекта User и Profile с отношениями один к одному.

$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder();
$qb->add('select', 'u')
   ->add('from', '\Acme\TestBundle\Entity\User u')
   ->add('orderBy', 'u.id DESC');
$query = $qb->getQuery();
$customer = $query->execute();

Когда я проверял количество запросов в профилировщике Symfony, я мог видеть число n для запросов, инициированных в таблице профилей для n пользователей в таблице пользователей. Есть ли способ, где я могу остановить запрос таблицы профилей.

Пожалуйста, дайте мне знать, есть ли лучший способ его реализации.

заранее спасибо

Добавлены классы сущностей

class User
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255)
     */
    private $email;

    /**
     * @var Acme\TestBundle\Entity\Profile
     * 
     * @ORM\OneToOne(targetEntity="Acme\TestBundle\Entity\Profile", mappedBy="user")
     */
    private $profile;

}

class Profile
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $user_id
     *
     * @ORM\Column(name="user_id", type="integer")
     */
    private $user_id;

    /**
     * @var string $user_name
     *
     * @ORM\Column(name="user_name", type="string", length=100)
     */
    private $user_name;

    /**
     * @var Acme\TestBundle\Entity\User
     * 
     * @ORM\OneToOne(targetEntity="Acme\TestBundle\Entity\User", inversedBy="profile")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;    

}

Ответ из журнала mysql

120110 15:14:29    89 Connect   root@localhost on test
           89 Query SET NAMES UTF8
           89 Query SELECT c0_.id AS id0, c0_.email AS email1, c0_.password AS password2, c0_.is_demo_user AS is_demo_user3, c0_.status AS status4, c0_.current_service AS current_service5, c0_.registration_mode AS registration_mode6, c0_.verification_code AS verification_code7, c0_.account_type AS account_type8, c0_.activated_date AS activated_date9, c0_.status_updated_at AS status_updated_at10, c0_.created_at AS created_at11, c0_.updated_at AS updated_at12 FROM user c0_ WHERE c0_.id = 1 ORDER BY c0_.email ASC
           89 Query SELECT t0.id AS id1, t0.user_id AS user_id2, t0.user_name AS user_name3, t0.age AS age4, t0.created_at AS created_at5, t0.updated_at AS updated_at6, t0.user_id AS user_id7 FROM profile t0 WHERE t0.user_id = '1'
           89 Quit  

person Nizam    schedule 10.01.2012    source источник
comment
Можете ли вы опубликовать содержимое вашего объекта User? Потому что, насколько я понимаю из руководства doctrine-project.org/docs/orm/2.0/en/reference/ этого не должно происходить, если вы не выполняете объединение выборки, указав оба объекта для выбора. Вы используете MySQL? Попробуйте включить mysql general-log и посмотрите, что именно отправляется на сервер с помощью tail -f /var/log/mysql/mysql.log (пример). Удачи   -  person Kees Schepers    schedule 10.01.2012
comment
Привет, Кес Шеперс, спасибо за ваш ответ, я добавил свою структуру класса сущностей к вопросу, и из кода запроса, который я добавил ранее, вы можете знать, что я не выполняю никакого соединения, даже если я присоединяюсь к таблице профилей только к запросу на получение пользователей влияет объединение, и все же существуют отдельные запросы для извлечения профиля.   -  person Nizam    schedule 10.01.2012
comment
Не могли бы вы также опубликовать точные запросы, которые Doctrine отправляет на ваш сервер? Из общего журнала? Не могли бы вы тоже попробовать однонаправленные отношения? doctrine- project.org/docs/orm/2.0/en/reference/   -  person Kees Schepers    schedule 10.01.2012
comment
Привет, Кес Шеперс. Еще раз спасибо за ваш ответ! Я добавил запрос из журнала.   -  person Nizam    schedule 10.01.2012
comment
Хм, странно, вы тоже пробовали однонаправленные отношения? Может это проясняет ситуацию..   -  person Kees Schepers    schedule 10.01.2012
comment
да, но это не решает проблему   -  person Nizam    schedule 10.01.2012
comment
Хм.. Я не понимаю. Согласно этой документации: krueckeberg.org/notes/d2.html#joins ваш DQL-запрос должен работать, а не извлекать записи из таблицы профилей. Какую версию Doctrine вы используете? И почему вы вызываете $query->execute() вместо $query->getArrayResult()? Не могли бы вы попробовать последний? Вы можете попробовать IRC-канал #doctrine.   -  person Kees Schepers    schedule 10.01.2012


Ответы (1)


Ваш ответ здесь!!

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

«Во многих случаях ассоциации между сущностями могут быть довольно большими. Даже в таком простом сценарии, как блог, где сообщения можно комментировать, вы всегда должны исходить из того, что сообщение привлекает сотни комментариев. В Doctrine 2.0, если вы обращались к ассоциации, она всегда полностью загружаются в память, что может привести к довольно серьезным проблемам с производительностью, если ваши ассоциации содержат несколько сотен или тысяч сущностей.

В Doctrine 2.1 для ассоциаций введена функция Extra Lazy. По умолчанию ассоциации помечены как Lazy, что означает, что весь объект коллекции для ассоциации заполняется при первом доступе к нему. Если вы пометите ассоциацию как очень ленивую, следующие методы для коллекций могут быть вызваны без полной загрузки коллекции:

<?php
namespace Doctrine\Tests\Models\CMS;

/**
 * @Entity
 */
class CmsGroup
{
    /**
     * @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
    */
    public $users;
}

Немного поздно, но это может помочь другим!

person thingygeoff    schedule 14.09.2012
comment
Привет, thingygeoff, спасибо за ответ, но ключевое слово Extra Lazy работает только для отношений «многие ко многим». - person Nizam; 03.10.2012