尝试仅加载当前用户的朋友时,我得到了朋友和所有其他用户
I get friends and all other users when trying to load only friends of the current user
在询问为什么我得到用户数据的朋友的空值后,我试图加载特定用户的朋友,回答说这是因为延迟加载。所以我被建议添加 JOIN 并且我承认这是我的失误。但是在添加 JOIN 之后,我在结果中得到了朋友的数据,然后我从我的用户 table 那里收到了我没有要求的所有用户。
我已经尝试从 SELECT 中删除 myuser,但这样我又遇到了延迟加载问题。我已经尝试过 LEFT JOIN(我承认这是我这边的愚蠢尝试)。但是在 Doctrine Query Language 中没有 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;
我的资料库(好友资料库):
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
希望我理解你的问题。
但据我所知,你在做 '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")
在询问为什么我得到用户数据的朋友的空值后,我试图加载特定用户的朋友,回答说这是因为延迟加载。所以我被建议添加 JOIN 并且我承认这是我的失误。但是在添加 JOIN 之后,我在结果中得到了朋友的数据,然后我从我的用户 table 那里收到了我没有要求的所有用户。
我已经尝试从 SELECT 中删除 myuser,但这样我又遇到了延迟加载问题。我已经尝试过 LEFT JOIN(我承认这是我这边的愚蠢尝试)。但是在 Doctrine Query Language 中没有 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;
我的资料库(好友资料库):
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
希望我理解你的问题。
但据我所知,你在做 '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")