学说2.1 - 获得实体限制

Krz*_*zos 4 php doctrine-orm

我有两个班:
游戏

/** @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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

新闻:

/** @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; }
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

$i = 1;
if($game->getNews()->count() > 0) {
    foreach($game->getNews()->getValues() as $v) {
        $news_list.= '<p>News '.$i.'</p>';
        $i++;
        if($i == 6) break;
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个问题:Doctrine会从数据库中下载与特定游戏相关的所有新闻,还是只需要那些我需要的5个?

第二个问题:如何在没有NewsGames课程的情况下使用Doctrine的单独查询下载5个新闻?

Gui*_*nco 5

预应答:在我开始回答之前,你并不需要从News ArrayCollection中获取getValues().你所能做的就是:

foreach ($game->getNews() as $news) {
    // Do whatever you want with associated News object.
}
Run Code Online (Sandbox Code Playgroud)

答案#1:Doctrine 2只会检索与此给定游戏相关的新闻,而不是其他任何内容.

答案#2:您不需要NewsGames对象.请注意,您映射的是连接表,因此在OO透视图中,对象永远不存在.

干杯,

吉列尔梅布兰科

  • 使用`EXTRA_LAZY`集合时,可以使用`foreach($ game-> getNews() - > slice($ start,$ end)作为$ news)来避免加载它们.{/*...*/} .如需更多精彩内容,请查看`Doctrine\Common\Collections\Collection`界面. (2认同)