如何将数量的双重关系映射到学说2中的同一表



我创建了两个表。

Players               Message
________              _________
id      -----------   id
                   |
username           -- sender_id
                   |
password           -- receiver_id
                      sent_on
                      text

我到目前为止拥有的实体是:

AppBundle Entity Message

class Message
{
/**
 * @var int
 *
 * @ORMColumn(name="id", type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var string
 *
 * @ORMColumn(name="text", type="text")
 */
private $text;
/**
 * @var DateTime
 *
 * @ORMColumn(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
 *
 * @ORMColumn(name="id", type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var string
 *
 * @ORMColumn(name="username", type="string", length=100, unique=true)
 */
private $username;
/**
 * @var string
 *
 * @ORMColumn(name="email", type="string", length=255, unique=true)
 */
private $email;
/**
 * @var string
 *
 * @ORMColumn(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()
{
}
}

我应该如何连接这两个表?连接是多曼尼还是仅仅是多人lt; -> onetomany?我想实现与

相同的
SELECT *
FROM messages, players
WHERE (players.id = messages.sender_id OR players.id = messages.receiver_id) AND players.id = 1

manytomany还是多人?

显然,这是一个许多方案,在多塔米尼场景中,您将有第三个表格,一个中间表。

如何连接这两个表

class Message
{
   //columns here
   //...
   /**
    * @ORMManyToOne(target="Player", inversedBy="receivedMessages")
    * @ORMJoinColumn(name="receiver_id",referencedColumnName="id")
    */
   protected $receiver;
   /**
    * @ORMManyToOne(target="Player", inversedBy="sentMessages")
    * @ORMJoinColumn(name="sender_id",referencedColumnName="id")
    */
   protected $sender;
   // create getters & setters
}
class Player implements UserInterface
{
    //columns here
    //...
   /**
    * @ORMOneToMany(target="Message", mappedBy="receiver")
    */
    protected $receivedMessages;
   /**
    * @ORMOneToMany(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 AppBundleEntityMessage m
  INNER JOIN m.sender s
  INNER JOIN m.receiver r
  WHERE s.id = 1 OR r.id = 1

相关内容

  • 没有找到相关文章

最新更新