我有两个班:
的游戏
/** @Entity @Table(name="games") */
class Game {
/** @Id @GeneratedValue @Column(type="integer") */
protected $id;
/** @Column(type="string", length=100) */
protected $title;
/** @ManyToMany(targetEntity="News", mappedBy="games") */
protected $news;
public function __construct() {
$this->news = new \Doctrine\Common\Collections\ArrayCollection();
}
public function getId() { return $this->id; }
public function setTitle($val) { $this->title = trim($val); }
public function getTitle() { return $this->title; }
public function getNews() { return $this->news; }
public function setNews($value) {
$except_txt = 'Jedna z przesłanych wartości nie jest instancją klasy News!';
if(is_array($value)) {
foreach($value as $v) {
if($v instanceof News) $this->news->add($v);
else throw new Exception($except_txt);
}
} else {
if($value instanceof News) $this->news->add($value);
else throw new Exception($except_txt);
}
}
}
新闻:
/** @Entity @Table(name="news") */
class News {
/** @Id @GeneratedValue @Column(type="integer") */
protected $id;
/** @Column(type="string", length=100) */
protected $title;
/** @Column(type="text") */
protected $content;
/**
* @ManyToOne(targetEntity="User", inversedBy="news")
* @JoinColumn(referencedColumnName="id")
*/
protected $author;
/** @Column(type="datetime") */
protected $add_date;
/**
* @ManyToMany(targetEntity="Game", inversedBy="news")
* @JoinTable(name="news_game",
* joinColumns={@JoinColumn(name="news_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="game_id", referencedColumnName="id")}
* )
*/
protected $games;
public function __construct() {
$this->add_date = new DateTime();
$this->games = new \Doctrine\Common\Collections\ArrayCollection();
}
# ID methods
public function getId() { return $this->id; }
# TITLE methods
public function setTitle($val) { $this->title = $val; }
public function getTitle() { return $this->title; }
# CONTENT methods
public function setContent($val) { $this->content = $val; }
public function getContent() { return $this->content; }
# AUTHOR methods
public function setAuthor($val) { if($val instanceof User) $this->author = $val; }
public function getAuthor() { return $this->author; }
# ADD DATE methods
public function getAddDate() { return $this->add_date; }
# GAMES methods
public function setGames($value) {
$except_txt = 'Jedna z przesłanych wartości nie jest instancją klasy Game!';
if(is_array($value)) {
foreach($value as $v) {
if($v instanceof Game) $this->games->add($v);
else throw new Exception($except_txt);
}
} else {
if($value instanceof Game) $this->games->add($value);
else throw new Exception($except_txt);
}
}
public function getGames() { return $this->games; }
}
这段代码:
$i = 1;
if($game->getNews()->count() > 0) {
foreach($game->getNews()->getValues() as $v) {
$news_list.= '<p>News '.$i.'</p>';
$i++;
if($i == 6) break;
}
}
第一个问题: Doctrine是否会从数据库中下载与特定游戏相关的所有新闻,或仅下载我需要的那些新闻?
第二个问题:
如何在没有NewsGames
类的情况下使用Doctrine的单独查询下载5个新闻?
答案 0 :(得分:5)
预先回答: 在我开始回答之前,你并不需要从News ArrayCollection中获取getValues()。 你所能做的就是:
foreach ($game->getNews() as $news) {
// Do whatever you want with associated News object.
}
答案#1: Doctrine 2只会检索与此给定游戏相关的新闻,而不是其他任何内容。
回答#2: 您不需要NewsGames对象。请注意,您映射的是连接表,因此在OO透视图中,对象永远不存在。
干杯,
Guilherme Blanco