Marin Bînzari
Marin Bînzari

Reputation: 5348

Doctrine doesn't find the rows just flushed

I have 3 entities: Subjects, Sections, Questions. Everyone has relations with the rest. I am trying to get the questions of the current $user. If there are none, I make a copy of the default ones with user = NULL.

But Doctrine gives me headaches. Initially it wouldn't get questions with null user. Now after flushing the new questions in the database it won't get them (they are inserted correctly).

Probably there is something that I don't see.

Why won't it retrieve the new questions?

<?php
public function getProfileQuestionsForUser( $user ) {
    $queryBuilder = $this->createQueryBuilder( 's' );
    $query = $queryBuilder
        ->select( 's, sc, q' )
        ->leftJoin( 's.sections', 'sc' )
        ->leftJoin( 'sc.questions', 'q', 'WITH', 'q.user = :USER' )
        ->where( 's.type = :TYPE' )
        ->setParameter( 'USER', $user )
        ->setParameter( 'TYPE', 'profile' )
        ->getQuery();
    $sql = $query->getSQL();

    /** @var SubjectEntity $result */
    $result = $query->getOneOrNullResult();

    $hasQuestions = false;
    foreach ( $result->getSections() as $section ) {
        $qs = count($section->getQuestions());
        if ( count( $section->getQuestions() ) ) {
            $hasQuestions = true;
            break;
        }
    }

    if ( $hasQuestions == false ) {
        $queryBuilder = $this->createQueryBuilder( 's' );
        $query = $queryBuilder
            ->select( 's, q, sc' )
            ->leftJoin( 's.sections', 'sc' )
            ->leftJoin( 's.questions', 'q', 'WITH', 'q.user IS NULL' )
            ->where( 's.type = :TYPE' )
            ->setParameter( 'TYPE', 'profile' )
            ->getQuery();
        $sql = $query->getSQL();

        /** @var SubjectEntity $subject */
        $subject = $query->getOneOrNullResult();

        if ( ! empty( $subject ) ) {
            /** @var QuestionEntity $question */
            $qs = count( $subject->getQuestions() );
            foreach ( $subject->getQuestions() as $question ) {
                $new_question = clone $question;
                $new_question->setUser( $user );
                $new_question->setAnswers( new ArrayCollection() );
                $new_question->setQuestionStatuses( new ArrayCollection() );
                $new_question->setOptions( new ArrayCollection() );
                $this->getEntityManager()->persist( $new_question );
            }
            $this->getEntityManager()->flush();

            // Retrieve new questions from DB
            $queryBuilder = $this->createQueryBuilder( 's' );
            $query = $queryBuilder
                ->select( 's, sc, q' )
                ->leftJoin( 's.sections', 'sc' )
                ->leftJoin( 'sc.questions', 'q', 'WITH', 'q.user = :USER' )
                ->where( 's.type = :TYPE' )
                ->setParameter( 'USER', $user )
                ->setParameter( 'TYPE', 'profile' )
                ->getQuery();
            $sql = $query->getSQL();

            $result = $query->getOneOrNullResult();
        }
    }

    return $result;
}

Upvotes: 0

Views: 600

Answers (1)

Smashou
Smashou

Reputation: 378

Maybe something like this will work:

//In your Question entity add this
public function __clone() {
    $this->id = null;
}

And modify your code like this:

        foreach ( $subject->getQuestions() as $question ) {
            $new_question = clone $question;

            $this->getEntityManager()->detach($new_question);

            $new_question->setUser( $user );
            $new_question->setAnswers( new ArrayCollection() );
            $new_question->setQuestionStatuses( new ArrayCollection() );
            $new_question->setOptions( new ArrayCollection() );
            $this->getEntityManager()->persist( $new_question );
        }
        $this->getEntityManager()->flush();

UPDATE

Hum, Here there is a more complete answer

Upvotes: 2

Related Questions