Я не могу понять, как это сделать, используя построитель запросов в Doctrine:
На высоком уровне я хочу получить все пользовательские таги, которые связаны с каждым пользователем, и я извлекаю каждого пользователя из таблицы отношений пользователя по их родительскому идентификатору.
Что-то вроде этого: from UserRelationship → get users by parent_id → also get each user associated userTags
. Это последний бит, который я не могу получить userTags
. Идеализм Я бы выбрал только параметры id
и name
из этой таблицы, так как остальные, такие как компания и пользователи, являются избыточными.
У меня есть запрос запроса запроса в Symfony 3. * Doctrine 2. *
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.
/**
* @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;
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;
}
}
замещать
'u.userTags',
с
'ut'
Это решит ошибку, которую вы получаете, но, вероятно, вы получите других. Я предлагаю изменить запрос на:
$qb
->select(
'r',
'u',
'ut',
...
Также замените 2-й, где: → andWhere ($qb-> expr() → eq ('r.parent', ': manager'))
Затем вы можете получить теги для каждого пользователя:
$userRel->getChild()->getUserTags();