두 개의 테이블이 생성되었습니다.
Players Message
________ _________
id ----------- id
|
username -- sender_id
|
password -- receiver_id
sent_on
text
지금까지 내가 가진 엔티티는 다음과 같습니다.
AppBundle \ Entity \ Message
class Message
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="text", type="text")
*/
private $text;
/**
* @var \DateTime
*
* @ORM\Column(name="sent_on", type="datetime")
*/
private $sentOn;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set text
*
* @param string $text
*
* @return Message
*/
public function setText($text)
{
$this->text = $text;
return $this;
}
/**
* Get text
*
* @return string
*/
public function getText()
{
return $this->text;
}
/**
* Set sentOn
*
* @param \DateTime $sentOn
*
* @return Message
*/
public function setSentOn($sentOn)
{
$this->sentOn = $sentOn;
return $this;
}
/**
* Get sentOn
*
* @return \DateTime
*/
public function getSentOn()
{
return $this->sentOn;
}
AppBundle \ Entity \ Player
class Player implements UserInterface
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=100, unique=true)
*/
private $username;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255, unique=true)
*/
private $email;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set username
*
* @param string $username
*
* @return Player
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get username
*
* @return string
*/
public function getUsername()
{
return $this->username;
}
/**
* Set password
*
* @param string $password
*
* @return Player
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Returns the roles granted to the user.
*
* <code>
* public function getRoles()
* {
* return array('ROLE_USER');
* }
* </code>
*
* Alternatively, the roles might be stored on a ``roles`` property,
* and populated in any number of different ways when the user object
* is created.
*
* @return (Role|string)[] The user roles
*/
public function getRoles()
{
return ['ROLE_USER'];
}
/**
* Returns the salt that was originally used to encode the password.
*
* This can return null if the password was not encoded using a salt.
*
* @return string|null The salt
*/
public function getSalt()
{
return null;
}
/**
* Removes sensitive data from the user.
*
* This is important if, at any given point, sensitive information like
* the plain-text password is stored on this object.
*/
public function eraseCredentials()
{
}
}
이 두 테이블을 어떻게 연결해야합니까? 연결이 ManyToMany입니까 아니면 ManyToOne <-> OneToMany입니까? 나는 같은 것을 달성하고 싶다.
SELECT *
FROM messages, players
WHERE (players.id = messages.sender_id OR players.id = messages.receiver_id) AND players.id = 1
ManyToMany 또는 ManyToOne?
이것은 분명히 ManyToOne 시나리오입니다. ManyToMany 시나리오에서는 세 번째 테이블 인 중간 테이블이 있습니다.
이 두 테이블을 연결하는 방법
class Message
{
//columns here
//...
/**
* @ORM\ManyToOne(target="Player", inversedBy="receivedMessages")
* @ORM\JoinColumn(name="receiver_id",referencedColumnName="id")
*/
protected $receiver;
/**
* @ORM\ManyToOne(target="Player", inversedBy="sentMessages")
* @ORM\JoinColumn(name="sender_id",referencedColumnName="id")
*/
protected $sender;
// create getters & setters
}
class Player implements UserInterface
{
//columns here
//...
/**
* @ORM\OneToMany(target="Message", mappedBy="receiver")
*/
protected $receivedMessages;
/**
* @ORM\OneToMany(target="Message", mappedBy="sender")
*/
protected $sentMessages;
// create getters & setters
}
SQL에서 DQL로
SQL :
SELECT *
FROM messages, players
WHERE (players.id = messages.sender_id OR players.id = messages.receiver_id)
AND players.id = 1
DQL에서는 OOP로 생각해야합니다 (보통 훨씬 더 자연스러운 생각입니다).
SELECT m, s, r
FROM \AppBundle\Entity\Message m
INNER JOIN m.sender s
INNER JOIN m.receiver r
WHERE s.id = 1 OR r.id = 1
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다