Php 原则2.1-一方关系、数据下载

Php 原则2.1-一方关系、数据下载,php,doctrine-orm,Php,Doctrine Orm,我有两门课: 用户: /** @Entity @Table(name="users") */ class User { /** * @Id @GeneratedValue @Column(type="integer") * @var integer */ protected $id; /** * @Column(type="string", length=20, unique=TRUE) * @var string

我有两门课:

用户

/** @Entity @Table(name="users") */
class User {
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @Column(type="string", length=20, unique=TRUE)
     * @var string
     */
    protected $login;

    /**
     * @OneToMany(targetEntity="News", mappedBy="author")
     */
    protected $news;    

    public function __construct() {
        $this->news = new \Doctrine\Common\Collections\ArrayCollection;
    }
}
/** @Entity @Table(name="news") */
class News {
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @Column(type="string", length=100)
     * @var string
     */
    protected $title;

    /**
     * @Column(type="text")
     * @var string
     */
    protected $content;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="news")
     * @JoinColumn(referencedColumnName="id")
     */ 
    protected $author;
}
新闻

/** @Entity @Table(name="users") */
class User {
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @Column(type="string", length=20, unique=TRUE)
     * @var string
     */
    protected $login;

    /**
     * @OneToMany(targetEntity="News", mappedBy="author")
     */
    protected $news;    

    public function __construct() {
        $this->news = new \Doctrine\Common\Collections\ArrayCollection;
    }
}
/** @Entity @Table(name="news") */
class News {
    /**
     * @Id @GeneratedValue @Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @Column(type="string", length=100)
     * @var string
     */
    protected $title;

    /**
     * @Column(type="text")
     * @var string
     */
    protected $content;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="news")
     * @JoinColumn(referencedColumnName="id")
     */ 
    protected $author;
}
我什么时候做这个代码

$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = '.$id);
$user = $q->getSingleResult();

条令是否会从数据库中下载所有新闻(由特定用户创建)?

除非您通过调用新闻访问器方法请求用户的新闻,否则条令不会下载。如果将查询重写为

SELECT u, n FROM User u JOIN u.news n
然后,一个用户和他的新闻都将作为结果返回

您还可以使用记录器检查条令生成的查询:

$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger);
PS:永远不要在查询中这样做:
u.id='.$id
,以避免sql注入。相反,请使用占位符:

$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = :id');
$q->setParameter('id', $id);

直到您通过调用news accessor方法请求用户的新闻,它才会生效。如果将查询重写为

SELECT u, n FROM User u JOIN u.news n
然后,一个用户和他的新闻都将作为结果返回

您还可以使用记录器检查条令生成的查询:

$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger);
PS:永远不要在查询中这样做:
u.id='.$id
,以避免sql注入。相反,请使用占位符:

$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = :id');
$q->setParameter('id', $id);

谢谢你的建议:)。下一个问题。只有当我使用
$User->getNews()
方法时,才会从DB下载用户的新闻?在您的示例中,如我在回答中所述,是的。否则它将下载真实应用程序中的所有数据库:)谢谢您的建议:)。下一个问题。只有当我使用
$User->getNews()
方法时,才会从DB下载用户的新闻?在您的示例中,如我在回答中所述,是的。否则它将下载真实应用程序中的所有数据库:)