Как я могу получить данные ассоциации из списка пользователей через отношения многие ко многим в доктрине построения запросов

0

Я не могу понять, как это сделать, используя построитель запросов в Doctrine:

На высоком уровне я хочу получить все пользовательские таги, которые связаны с каждым пользователем, и я извлекаю каждого пользователя из таблицы отношений пользователя по их родительскому идентификатору.

Что-то вроде этого: from UserRelationship → get users by parent_id → also get each user associated userTags. Это последний бит, который я не могу получить userTags. Идеализм Я бы выбрал только параметры id и name из этой таблицы, так как остальные, такие как компания и пользователи, являются избыточными.

У меня есть запрос запроса запроса в Symfony 3. * Doctrine 2. *

UserRelationshipRepository.php

protected function getBaseSubordinateQuery($managerId ){

    $qb = $this->createQueryBuilder('r');

    $qb
        ->select(
            'u.id',
            'u.username',
            'u.email',
            'u.first_name',
            'u.last_name',
            'u.lastLogin',
            'u.userTags', // <-- How do I get these values?
            'c.phone',
            'c.position as jobTitle',
            'co.name as company',
            'c.createdAt',
            'max(cl.expiresAt) as expiresAt',
            'cl.expiresAt',
            'c.yearsInPosition as titleSince',
            'c.skype',
            'c.linkedin',
            'c.yearsAtCompany',
            'up.path as imgPath',
            'up.name as imgName',
            'up.format as imgFormat'
        )
        ->innerJoin( 'r.child', 'u' )
        ->innerJoin( 'u.clientInfo', 'c' )
        ->leftJoin( 'u.userTags', 'ut' )
        ->where('ut IS NOT NULL')
        ->leftJoin( 'u.company', 'co' )
        ->leftJoin( 'c.clientLicense', 'cl' )
        ->leftJoin( 'u.userPhotos', 'up' )
        ->where ( $qb->expr()->eq('r.parent', ':manager') )
        ->setParameter('manager', $managerId)
    ;

    return $qb;

Примечание: как бы то ни было, этот запрос дает мне ошибку: 500 Internal Server Error. [Semantical Error] line 0, col 76 near 'userTags, c.phone,': Error: Invalid PathExpression. Must be a StateFieldPathExpression. 500 Internal Server Error. [Semantical Error] line 0, col 76 near 'userTags, c.phone,': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

User.php

    /**
 * @var \Doctrine\Common\Collections\Collection|\Reddin\Bundle\CMSBundle\Entity\UserTag[]
 *
 * @ORM\ManyToMany(targetEntity="Reddin\Bundle\CMSBundle\Entity\UserTag", inversedBy="users")
 * @ORM\JoinTable(name="users_user_tags")
 *
 * @JMS\Groups({"tags"})
 * @JMS\MaxDepth(2)
 */
protected $userTags;

UserTag.php

class UserTag
{
    use Timestampable;

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

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

    /**
     * Many UserTags belong to one Company.
     *
     * @ORM\ManyToOne(targetEntity="Reddin\Bundle\CMSBundle\Entity\Company", inversedBy="userTags", fetch="EXTRA_LAZY")
     * @ORM\JoinColumn(name="company_id", referencedColumnName="id")
     * @JMS\MaxDepth(2)
     */
    private $company;

    /**
     * @var \Doctrine\Common\Collections\Collection|\Reddin\Bundle\UserAccountBundle\Entity\User[]
     *
     * @ORM\ManyToMany(targetEntity="Reddin\Bundle\UserAccountBundle\Entity\User", mappedBy="userTags", fetch="EXTRA_LAZY")
     * @JMS\MaxDepth(2)
     */
    private $users;

    /**
     * Company constructor.
     */
    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function __toString()
    {
        return "" . $this->getName();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return UserTag
     */
    public function setName($name) {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName() {
        return $this->name;
    }

    /**
     * @return ArrayCollection|User[]
     */
    public function getUsers()
    {
        return $this->users;
    }

    /**
     * @return UserTag
     */
    public function getCompany() {
        return $this->company;
    }

    /**
     * @param Company $company
     * @return UserTag
     */
    public function setCompany(Company $company = null) {
        $this->company = $company;

        return $this;
    }
}
Теги:
many-to-many
doctrine
doctrine2
query-builder

1 ответ

1
Лучший ответ

замещать

'u.userTags',

с

'ut'

Это решит ошибку, которую вы получаете, но, вероятно, вы получите других. Я предлагаю изменить запрос на:

$qb
    ->select(
        'r',
        'u',
        'ut',
        ...

Также замените 2-й, где: → andWhere ($qb-> expr() → eq ('r.parent', ': manager'))

Затем вы можете получить теги для каждого пользователя:

 $userRel->getChild()->getUserTags();
  • 0
    Спасибо, я пытался избежать выполнения другого запроса для получения тегов и загрузки целых объектов. В конце концов, я переключился на нативный SQL-запрос, и было проще и интуитивно лучше понять его. Я приму этот ответ для тех, кто может найти его полезным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню