Я получаю друзей и всех других пользователей, когда пытаюсь загрузить только друзей текущего пользователя - PullRequest
0 голосов
/ 16 января 2019

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

Я уже пытался удалить myuser из SELECT,но так я снова получаю проблему с отложенной загрузкой.Я попробовал ЛЕВОЕ СОЕДИНЕНИЕ (я признаю, что это была глупая попытка с моей стороны).Но как я могу исправить это, если на языке запросов доктрины нет ON.

Моя сущность (друзья):

class Friends
{

/**
 * @ORM\Id()
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="myfriends")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
 */

private $friendsWithMe;


/**
 * @ORM\Id()
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="friendof")
 * @ORM\JoinColumn(name="friend_id", referencedColumnName="id", nullable=false)
 */

private $afriendof;

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



/**
 * @return User
 */
public function getFriendsWithMe()
{
    return $this->friendsWithMe;
}

/**
 * @param mixed $friendsWithMe
 */
public function setFriendsWithMe($friendsWithMe)
{
    $this->friendsWithMe = $friendsWithMe;
}

/**
 * @return User
 */
public function getAfriendof()
{
    return $this->afriendof;
}

/**
 * @param mixed $afriendof
 */
public function setAfriendof($afriendof)
{
    $this->afriendof = $afriendof;
}

/**
 * @return integer
 */
public function getStatus()
{
    return $this->status;
}

/**
 * @param integer $status
 */
public function setStatus($status)
{
    $this->status = $status;
}
}

Моя сущность (пользователь):

class User implements UserInterface
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;
 public function __construct()
{
    $this->userPosts = new ArrayCollection();
    $this->myfriends = new ArrayCollection();
    $this->friendof = new ArrayCollection();
}


/**
 * @var
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Friends", mappedBy="afriendof")
 */

private $friendof;
/**
 * @var
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Friends", mappedBy="friendsWithMe")
 */
private $myfriends;

Мой репозиторий (FriendsRepository):

public function personalFriends($userId){

    $em = $this->getEntityManager();
    $result = $em->createQuery('SELECT friends, myuser FROM AppBundle\Entity\Friends friends 
    INNER JOIN AppBundle\Entity\User myuser WHERE friends.friendsWithMe = :userId AND friends.status = 1');
    $result->setParameter('userId', $userId);
    return $result->getResult();
}

Место, где я вызываю репозиторий:

public function indexAction(Request $request)
    {

    $user = $this->get('security.token_storage')->getToken()->getUser();
    $userId = $user->getId();
    $friends = $this->getDoctrine()->getRepository(Friends::class)->personalFriends($userId);
    dump($friends);
    exit();

Результаты, которые я получаю сейчас: https://pastebin.com/2M4SYTLb Результаты, которые яожидайте: https://pastebin.com/BxsC9QbE

1 Ответ

0 голосов
/ 16 января 2019

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

Попробуйте только выбрать friends

Как это:

SELECT friend FROM AppBundle\Entity\Friends friend INNER JOIN AppBundle\Entity\User user WHERE friend.friendsWithMe = :userId AND friend.status = 1

Тогда в результате у вас будет только массив Друзей.

Если проблема не устранена, вы можете добавить fetch = "EAGER", чтобы она не была "LAZY"

* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="myfriends", fetch="EAGER")

...